]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Merge remote-tracking branch 'remotes/origin/master' into CEA_2019
authorazv <azv@opencascade.com>
Wed, 20 Nov 2019 07:38:11 +0000 (10:38 +0300)
committerazv <azv@opencascade.com>
Wed, 20 Nov 2019 07:43:12 +0000 (10:43 +0300)
# Conflicts:
# CMakeLists.txt
# src/BuildPlugin/BuildPlugin_msg_fr.ts
# src/CollectionPlugin/CollectionPlugin_msg_fr.ts
# src/ConstructionPlugin/ConstructionPlugin_msg_fr.ts
# src/FeaturesPlugin/FeaturesPlugin_Chamfer.cpp
# src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts
# src/FiltersPlugin/CMakeLists.txt
# src/GeomAlgoAPI/CMakeLists.txt
# src/GeomAlgoAPI/GeomAlgoAPI_Chamfer.cpp
# src/GeomAlgoAPI/GeomAlgoAPI_Chamfer.h
# src/PythonAddons/Test/TestcompoundVertices.py
# src/PythonAddons/macros/compoundVertices/feature.py
# src/PythonAddons/macros/compoundVertices/widget.xml
# src/PythonAddons/macros/importParameters/feature.py
# src/PythonAddons/macros/importParameters/importParameters.txt
# src/PythonAddons/macros/importParameters/widget.xml
# src/SHAPERGUI/SHAPERGUI_msg_fr.ts
# src/XGUI/XGUI_msg_fr.ts

167 files changed:
CMakeLists.txt
src/BuildAPI/BuildAPI_Vertex.cpp
src/BuildAPI/BuildAPI_Vertex.h
src/BuildPlugin/BuildPlugin_Plugin.cpp
src/BuildPlugin/BuildPlugin_Validators.cpp
src/BuildPlugin/BuildPlugin_Validators.h
src/BuildPlugin/BuildPlugin_Vertex.cpp
src/BuildPlugin/BuildPlugin_Vertex.h
src/BuildPlugin/BuildPlugin_msg_fr.ts [new file with mode: 0644]
src/BuildPlugin/CMakeLists.txt
src/BuildPlugin/Test/TestVertex.py
src/BuildPlugin/vertex_widget.xml
src/CollectionPlugin/CMakeLists.txt
src/CollectionPlugin/CollectionPlugin_msg_fr.ts [new file with mode: 0644]
src/Config/Config_Keywords.h
src/ConnectorPlugin/CMakeLists.txt
src/ConnectorPlugin/ConnectorPlugin_msg_fr.ts [new file with mode: 0644]
src/ConstructionPlugin/CMakeLists.txt
src/ConstructionPlugin/ConstructionPlugin_msg_fr.ts [new file with mode: 0644]
src/Events/Events.i
src/Events/Events_Listener.h
src/ExchangePlugin/CMakeLists.txt
src/ExchangePlugin/ExchangePlugin_msg_fr.ts [new file with mode: 0644]
src/FeaturesAPI/FeaturesAPI_ExtrusionBoolean.cpp
src/FeaturesAPI/FeaturesAPI_ExtrusionBoolean.h
src/FeaturesAPI/FeaturesAPI_RevolutionBoolean.cpp
src/FeaturesAPI/FeaturesAPI_RevolutionBoolean.h
src/FeaturesPlugin/CMakeLists.txt
src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp
src/FeaturesPlugin/FeaturesPlugin_Extrusion.h
src/FeaturesPlugin/FeaturesPlugin_ExtrusionBoolean.cpp
src/FeaturesPlugin/FeaturesPlugin_ExtrusionBoolean.h
src/FeaturesPlugin/FeaturesPlugin_ExtrusionFuse.cpp
src/FeaturesPlugin/FeaturesPlugin_ExtrusionFuse.h
src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp
src/FeaturesPlugin/FeaturesPlugin_Revolution.h
src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts [new file with mode: 0644]
src/FeaturesPlugin/Test/TestExtrusionCut_ThroughAll.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestExtrusionFuse_ThroughAll.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestRevolutionCut_ThroughAll.py [new file with mode: 0644]
src/FeaturesPlugin/Test/TestRevolutionFuse_ThroughAll.py [new file with mode: 0644]
src/FeaturesPlugin/doc/TUI_extrusionCutThroughAll.rst [new file with mode: 0644]
src/FeaturesPlugin/doc/TUI_extrusionFuseThroughAll.rst [new file with mode: 0644]
src/FeaturesPlugin/doc/TUI_revolutionCutThroughAll.rst [new file with mode: 0644]
src/FeaturesPlugin/doc/TUI_revolutionFuseThroughAll.rst [new file with mode: 0644]
src/FeaturesPlugin/doc/examples/extrusion_cut_through_all.py [new file with mode: 0644]
src/FeaturesPlugin/doc/examples/extrusion_fuse_through_all.py [new file with mode: 0644]
src/FeaturesPlugin/doc/examples/revolution_cut_through_all.py [new file with mode: 0644]
src/FeaturesPlugin/doc/examples/revolution_fuse_through_all.py [new file with mode: 0644]
src/FeaturesPlugin/doc/extrusionCutFeature.rst
src/FeaturesPlugin/doc/extrusionFuseFeature.rst
src/FeaturesPlugin/doc/images/ExtrusionCut1.png
src/FeaturesPlugin/doc/images/ExtrusionCut2.png
src/FeaturesPlugin/doc/images/ExtrusionCut3.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/ExtrusionFuse1.png
src/FeaturesPlugin/doc/images/ExtrusionFuse2.png
src/FeaturesPlugin/doc/images/ExtrusionFuse3.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/RevolutionCut1.png
src/FeaturesPlugin/doc/images/RevolutionCut2.png
src/FeaturesPlugin/doc/images/RevolutionCut3.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/RevolutionFuse1.png
src/FeaturesPlugin/doc/images/RevolutionFuse2.png
src/FeaturesPlugin/doc/images/RevolutionFuse3.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/extrusion_cut_through_all_result.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/extrusion_fuse_through_all_result.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/extrusion_through_all.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/revolution_cut_through_all_result.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/revolution_fuse_through_all_result.png [new file with mode: 0644]
src/FeaturesPlugin/doc/images/revolution_through_all.png [new file with mode: 0644]
src/FeaturesPlugin/doc/revolutionCutFeature.rst
src/FeaturesPlugin/doc/revolutionFuseFeature.rst
src/FeaturesPlugin/extrusioncut_widget.xml
src/FeaturesPlugin/extrusionfuse_widget.xml
src/FeaturesPlugin/icons/extrusion_throughall_32x32.png [new file with mode: 0644]
src/FeaturesPlugin/icons/revol_throughall_32x32.png [new file with mode: 0644]
src/FeaturesPlugin/revolutioncut_widget.xml
src/FeaturesPlugin/revolutionfuse_widget.xml
src/GeomAlgoAPI/CMakeLists.txt
src/GeomAlgoAPI/GeomAlgoAPI_Boolean.h
src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp
src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.h
src/GeomAlgoAPI/GeomAlgoAPI_ThroughAll.cpp [new file with mode: 0644]
src/GeomAlgoAPI/GeomAlgoAPI_ThroughAll.h [new file with mode: 0644]
src/GeomDataAPI/CMakeLists.txt
src/GeomDataAPI/GeomDataAPI_swig.h
src/GeomValidators/GeomValidators_ZeroOffset.cpp
src/Model/Model_AttributeIntArray.cpp
src/Model/Model_AttributeIntArray.h
src/ModelAPI/CMakeLists.txt
src/ModelAPI/ModelAPI.i
src/ModelAPI/ModelAPI_AttributeIntArray.h
src/ModelAPI/ModelAPI_Events.h
src/ModelAPI/ModelAPI_Tools.cpp
src/ModelAPI/ModelAPI_Tools.h
src/ModelAPI/ModelAPI_swig.h
src/ModuleBase/CMakeLists.txt
src/ModuleBase/ModuleBase_IModule.cpp
src/ModuleBase/ModuleBase_IModule.h
src/ModuleBase/ModuleBase_ModelWidget.cpp
src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_Tools.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_msg_fr.ts [new file with mode: 0644]
src/ParametersPlugin/CMakeLists.txt
src/ParametersPlugin/ParametersPlugin_msg_fr.ts [new file with mode: 0644]
src/PartSet/CMakeLists.txt
src/PartSet/PartSet_CustomPrs.cpp
src/PartSet/PartSet_Module.cpp
src/PartSet/PartSet_Module.h
src/PartSet/PartSet_OverconstraintListener.cpp
src/PartSet/PartSet_OverconstraintListener.h
src/PartSet/PartSet_SketcherMgr.cpp
src/PartSet/PartSet_SketcherMgr.h
src/PartSet/PartSet_Tools.cpp
src/PartSet/PartSet_Tools.h
src/PartSet/PartSet_WidgetSketchLabel.cpp
src/PartSet/PartSet_WidgetSketchLabel.h
src/PartSet/PartSet_msg_fr.ts [new file with mode: 0644]
src/PartSetPlugin/CMakeLists.txt
src/PartSetPlugin/PartSetPlugin_msg_fr.ts [new file with mode: 0644]
src/PrimitivesPlugin/CMakeLists.txt
src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts [new file with mode: 0644]
src/SHAPERGUI/CMakeLists.txt
src/SHAPERGUI/SHAPERGUI_msg_fr.ts [new file with mode: 0644]
src/SketchAPI/SketchAPI_Sketch.cpp
src/SketchPlugin/CMakeLists.txt
src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp
src/SketchPlugin/SketchPlugin_ConstraintDistance.cpp
src/SketchPlugin/SketchPlugin_ConstraintDistanceAlongDir.cpp
src/SketchPlugin/SketchPlugin_ConstraintLength.cpp
src/SketchPlugin/SketchPlugin_ConstraintRadius.cpp
src/SketchPlugin/SketchPlugin_Fillet.cpp
src/SketchPlugin/SketchPlugin_MacroArc.cpp
src/SketchPlugin/SketchPlugin_MacroCircle.cpp
src/SketchPlugin/SketchPlugin_MacroEllipse.cpp
src/SketchPlugin/SketchPlugin_MacroEllipticArc.cpp
src/SketchPlugin/SketchPlugin_Plugin.cpp
src/SketchPlugin/SketchPlugin_Projection.cpp
src/SketchPlugin/SketchPlugin_Sketch.h
src/SketchPlugin/SketchPlugin_SketchEntity.h
src/SketchPlugin/SketchPlugin_Tools.cpp
src/SketchPlugin/SketchPlugin_Tools.h
src/SketchPlugin/SketchPlugin_msg_fr.ts [new file with mode: 0644]
src/SketchPlugin/Test/TestConstraintTangentEllipticArc.py
src/SketchPlugin/Test/TestMoveEllipticArc.py [new file with mode: 0644]
src/SketchPlugin/Test/TestRemainingDoF.py [new file with mode: 0644]
src/SketchPlugin/plugin-Sketch.xml
src/SketchSolver/CMakeLists.txt
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Solver.cpp
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Solver.h
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.cpp
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.h
src/SketchSolver/SketchSolver_Group.cpp
src/SketchSolver/SketchSolver_Group.h
src/SketchSolver/SketchSolver_Manager.cpp
src/SketchSolver/SketchSolver_Manager.h
src/SketchSolver/SketchSolver_Storage.h
src/SketchSolver/SketchSolver_msg_fr.ts [new file with mode: 0644]
src/XGUI/CMakeLists.txt
src/XGUI/XGUI_CustomPrs.cpp [deleted file]
src/XGUI/XGUI_CustomPrs.h [deleted file]
src/XGUI/XGUI_Displayer.cpp
src/XGUI/XGUI_Displayer.h
src/XGUI/XGUI_Workshop.cpp
src/XGUI/XGUI_WorkshopListener.cpp
src/XGUI/XGUI_WorkshopListener.h
src/XGUI/XGUI_msg_fr.ts [new file with mode: 0644]

index ff40cf5b789bfad0a0ad9ea04b477b034b667a04..a753f404c1b866b3754794d1604d139a2b17e688 100644 (file)
@@ -120,7 +120,9 @@ ENDIF(${HAVE_SALOME})
 # Sketcher: Change radius of circular edges while dragging a point on the edge
 SET(SKETCHER_CHANGE_RADIUS_WHEN_MOVE TRUE)
 
+SET(MAKE_TRANSLATION YES)
 
+    ADD_DEFINITIONS( -DMAKE_TRANSLATION )
 ADD_SUBDIRECTORY (src/Config)
 ADD_SUBDIRECTORY (src/Events)
 ADD_SUBDIRECTORY (src/Selector)
index 327a2d2905d2b856c9dd346db41f294612eb17e0..f94b230f18cf841a6f2161690c27852faae9d2f5 100644 (file)
@@ -35,6 +35,19 @@ BuildAPI_Vertex::BuildAPI_Vertex(const std::shared_ptr<ModelAPI_Feature>& theFea
 : ModelHighAPI_Interface(theFeature)
 {
   if(initialize()) {
+    fillAttribute(false, mydoIntersect);
+    setBase(theBaseObjects);
+  }
+}
+
+//==================================================================================================
+BuildAPI_Vertex::BuildAPI_Vertex(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                                 const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                 const bool theDoIntersect)
+: ModelHighAPI_Interface(theFeature)
+{
+  if(initialize()) {
+    fillAttribute(theDoIntersect, mydoIntersect);
     setBase(theBaseObjects);
   }
 }
@@ -61,6 +74,15 @@ VertexPtr addVertex(const std::shared_ptr<ModelAPI_Document>& thePart,
   return VertexPtr(new BuildAPI_Vertex(aFeature, theBaseObjects));
 }
 
+//==================================================================================================
+VertexPtr addVertex(const std::shared_ptr<ModelAPI_Document>& thePart,
+                    const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                    const bool theDoIntersect)
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature = thePart->addFeature(BuildAPI_Vertex::ID());
+  return VertexPtr(new BuildAPI_Vertex(aFeature, theBaseObjects, theDoIntersect));
+}
+
 //==================================================================================================
 void BuildAPI_Vertex::dump(ModelHighAPI_Dumper& theDumper) const
 {
@@ -68,5 +90,6 @@ void BuildAPI_Vertex::dump(ModelHighAPI_Dumper& theDumper) const
   std::string aPartName = theDumper.name(aBase->document());
 
   theDumper << aBase << " = model.addVertex(" << aPartName << ", "
-            << aBase->selectionList(BuildPlugin_Vertex::BASE_OBJECTS_ID()) << ")" << std::endl;
+            << aBase->selectionList(BuildPlugin_Vertex::BASE_OBJECTS_ID()) << ", "
+            << aBase->boolean(BuildPlugin_Vertex::INTERSECT_ID()) << ")" << std::endl;
 }
index 6a96640a488d964b798e75a09b581abe1f85bb23..77ba77e957db28fb06ba7797a56e69737d51fbff 100644 (file)
@@ -44,13 +44,21 @@ public:
   explicit BuildAPI_Vertex(const std::shared_ptr<ModelAPI_Feature>& theFeature,
                            const std::list<ModelHighAPI_Selection>& theBaseObjects);
 
+  /// Constructor with values.
+  BUILDAPI_EXPORT
+  explicit BuildAPI_Vertex(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                           const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                           const bool theDoIntersect);
+
   /// Destructor.
   BUILDAPI_EXPORT
   virtual ~BuildAPI_Vertex();
 
-  INTERFACE_1(BuildPlugin_Vertex::ID(),
+  INTERFACE_2(BuildPlugin_Vertex::ID(),
               baseObjects, BuildPlugin_Vertex::BASE_OBJECTS_ID(),
-              ModelAPI_AttributeSelectionList, /** Base objects */)
+              ModelAPI_AttributeSelectionList, /** Base objects */,
+              doIntersect, BuildPlugin_Vertex::INTERSECT_ID(),
+              ModelAPI_AttributeBoolean, /** Compute intersections */)
 
   /// Modify base attribute of the feature.
   BUILDAPI_EXPORT
@@ -70,4 +78,11 @@ BUILDAPI_EXPORT
 VertexPtr addVertex(const std::shared_ptr<ModelAPI_Document>& thePart,
                     const std::list<ModelHighAPI_Selection>& theBaseObjects);
 
+/// \ingroup CPPHighAPI
+/// \brief Create Vertex feature.
+BUILDAPI_EXPORT
+VertexPtr addVertex(const std::shared_ptr<ModelAPI_Document>& thePart,
+                    const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                    const bool theDoIntersect);
+
 #endif // BuildAPI_Vertex_H_
index 5d37e3299e8602c5efddd19b4c8561d6b14de795..4c20e54ddcc2f84b1dcbdb071414530c62f66130 100644 (file)
@@ -57,6 +57,8 @@ BuildPlugin_Plugin::BuildPlugin_Plugin()
                               new BuildPlugin_ValidatorSubShapesSelection());
   aFactory->registerValidator("BuildPlugin_ValidatorFillingSelection",
                               new BuildPlugin_ValidatorFillingSelection());
+  aFactory->registerValidator("BuildPlugin_ValidatorBaseForVertex",
+                              new BuildPlugin_ValidatorBaseForVertex());
 
   // Register this plugin.
   ModelAPI_Session::get()->registerPlugin(this);
index 65be3411933356f25d4724b941c2659b693436a4..6b44423f877549b50f43992147414e87f3b68c6e 100644 (file)
@@ -464,7 +464,7 @@ bool BuildPlugin_ValidatorFillingSelection::isValid(const AttributePtr& theAttri
     return false;
   }
 
-  FeaturePtr anOwner = ModelAPI_Feature::feature(theAttribute->owner());
+  //FeaturePtr anOwner = ModelAPI_Feature::feature(theAttribute->owner());
 
   // Check selected shapes.
   for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
@@ -491,3 +491,61 @@ bool BuildPlugin_ValidatorFillingSelection::isValid(const AttributePtr& theAttri
 
   return true;
 }
+
+
+//=================================================================================================
+bool BuildPlugin_ValidatorBaseForVertex::isValid(const AttributePtr& theAttribute,
+                                                 const std::list<std::string>& /*theArguments*/,
+                                                 Events_InfoMessage& theError) const
+{
+  if (!theAttribute.get()) {
+    theError = "Error: empty selection.";
+    return false;
+  }
+
+  AttributeSelectionListPtr aSelectionList =
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
+  if (!aSelectionList.get()) {
+    theError = "Could not get selection list.";
+    return false;
+  }
+
+  for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
+    AttributeSelectionPtr aSelectionAttr = aSelectionList->value(anIndex);
+    if (!aSelectionAttr.get()) {
+      theError = "Empty attribute in list.";
+      return false;
+    }
+
+    // Vertex?
+    bool isVertex = false;
+    GeomShapePtr aShapeInList = aSelectionAttr->value();
+    if (aShapeInList.get()) {
+      isVertex = (aShapeInList->shapeType() == GeomAPI_Shape::VERTEX);
+    }
+
+    if (!isVertex) {
+      // Sketch?
+      FeaturePtr aFeature = aSelectionAttr->contextFeature();
+      if (!aFeature.get()) {
+        ResultPtr aContext = aSelectionAttr->context();
+        if (aContext.get()) {
+          aFeature = ModelAPI_Feature::feature(aContext);
+        }
+      }
+
+      if (aFeature.get()) {
+        std::string aFeatureKind = aFeature->getKind();
+        if (aFeatureKind != "Sketch" &&
+            aFeatureKind != "Point" &&
+            aFeatureKind != "Vertex") {
+          theError = "Error: %1 shape is not allowed for selection.";
+          theError.arg(aFeatureKind);
+          return false;
+        }
+      }
+    }
+  }
+
+  return true;
+}
index 4c54b6b7b8ef5b2c7d1ab3d65b91032f8298465f..116d44afcfefc596cde350b124f9998c093a11d5 100644 (file)
@@ -118,4 +118,19 @@ public:
                         Events_InfoMessage& theError) const;
 };
 
+/// \class BuildPlugin_ValidatorBaseForVertex
+/// \ingroup Validators
+/// \brief A validator for selection of Vertex feature.
+class BuildPlugin_ValidatorBaseForVertex: public ModelAPI_AttributeValidator
+{
+public:
+  //! Returns true if attribute is ok.
+  //! \param[in] theAttribute the checked attribute.
+  //! \param[in] theArguments arguments of the attribute.
+  //! \param[out] theError error message.
+   virtual bool isValid(const AttributePtr& theAttribute,
+                        const std::list<std::string>& theArguments,
+                        Events_InfoMessage& theError) const;
+};
+
 #endif
index 82f3521ed81ac72dd66859b97c9a7e5a19e83bef..cd14766ed902b40105e2d42c9db29d47c36a09ae 100644 (file)
 #include "BuildPlugin_Vertex.h"
 
 #include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeBoolean.h>
+#include <ModelAPI_CompositeFeature.h>
 #include <ModelAPI_ResultBody.h>
+#include <ModelAPI_Validator.h>
+#include <ModelAPI_Session.h>
 
 #include <GeomAlgoAPI_Copy.h>
 #include <GeomAlgoAPI_Tools.h>
+#include <GeomAlgoAPI_Partition.h>
+#include <GeomAlgoAPI_ShapeTools.h>
+
+#include <GeomAPI_ShapeExplorer.h>
 
 //=================================================================================================
 BuildPlugin_Vertex::BuildPlugin_Vertex()
@@ -34,62 +42,242 @@ BuildPlugin_Vertex::BuildPlugin_Vertex()
 void BuildPlugin_Vertex::initAttributes()
 {
   data()->addAttribute(BASE_OBJECTS_ID(), ModelAPI_AttributeSelectionList::typeId());
+
+  data()->addAttribute(INTERSECT_ID(), ModelAPI_AttributeBoolean::typeId());
+  ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), INTERSECT_ID());
+}
+
+//=================================================================================================
+bool BuildPlugin_Vertex::buildVertices(GeomShapePtr theShape,
+                                       bool isIntersect,
+                                       int& theResultIndex)
+{
+  if (!theShape.get()) {
+    setError("Error: Empty shape selected.");
+    return false;
+  }
+
+  if (theShape->shapeType() == GeomAPI_Shape::VERTEX) {
+    // Copy shape.
+    std::shared_ptr<GeomAlgoAPI_Copy> aCopyAlgo(new GeomAlgoAPI_Copy(theShape));
+
+    std::string anError;
+    if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aCopyAlgo, getKind(), anError)) {
+      setError(anError);
+      return false;
+    }
+
+    // Store result.
+    ResultBodyPtr aResultBody = document()->createBody(data(), theResultIndex);
+    aResultBody->storeModified(theShape, aCopyAlgo->shape());
+    setResult(aResultBody, theResultIndex);
+    ++theResultIndex;
+  } else {
+    // Sketch
+    GeomAPI_DataMapOfShapeShape alreadyProcessed;
+
+    // 1. Explode on Vertices
+    for (GeomAPI_ShapeExplorer anExp (theShape, GeomAPI_Shape::VERTEX); anExp.more(); anExp.next()) {
+      GeomShapePtr aSubShape = anExp.current();
+
+      if (alreadyProcessed.bind(aSubShape, aSubShape)) {
+        // Store result.
+        ResultBodyPtr aResultBody = document()->createBody(data(), theResultIndex);
+        aResultBody->storeModified(theShape, aSubShape);
+        setResult(aResultBody, theResultIndex);
+        ++theResultIndex;
+      }
+    }
+
+    // 2. If need intersection points, perform Partition
+    if (isIntersect) {
+      // Partition
+      ListOfShape anObjList, aTools;
+      anObjList.push_back(theShape);
+      std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo (new GeomAlgoAPI_Partition(anObjList, aTools));
+
+      std::string anError;
+      if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aPartitionAlgo, getKind(), anError)) {
+        setError(anError);
+        return false;
+      }
+      GeomShapePtr aSplittedSketch = aPartitionAlgo->shape();
+
+      // Explode on Vertices, skip vertices of initial sketch
+      for (GeomAPI_ShapeExplorer anExp (aSplittedSketch, GeomAPI_Shape::VERTEX); anExp.more(); anExp.next()) {
+        GeomShapePtr aSubShape = anExp.current();
+
+        //if (!theShape->isSubShape(aSubShape)) { // skip vertices of initial sketch
+        if (alreadyProcessed.bind(aSubShape, aSubShape)) {
+          // Store result.
+          ResultBodyPtr aResultBody = document()->createBody(data(), theResultIndex);
+          aResultBody->storeGenerated(anObjList, aSubShape, aPartitionAlgo);
+          setResult(aResultBody, theResultIndex);
+          ++theResultIndex;
+        }
+      }
+    }
+  }
+
+  return true;
 }
 
 //=================================================================================================
+bool BuildPlugin_Vertex::buildVertices(FeaturePtr theFeature,
+                                       bool isIntersect,
+                                       int& theResultIndex)
+{
+  if (theFeature->getKind() != "Sketch") return false;
+
+  // Sub-features
+  CompositeFeaturePtr aComposite =
+    std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(theFeature);
+  if (!aComposite) return false;
+  int nbSubs = aComposite->numberOfSubs();
+  if (nbSubs < 1) return false;
+
+  // The whole sketch shape
+  ResultPtr aContext = theFeature->firstResult();
+  GeomShapePtr theShape = aContext->shape();
+
+  GeomAPI_DataMapOfShapeShape alreadyProcessed;
+
+  // 1. Explode on Vertices
+  for (GeomAPI_ShapeExplorer anExp (theShape, GeomAPI_Shape::VERTEX); anExp.more(); anExp.next()) {
+    GeomShapePtr aSubShape = anExp.current();
+
+    if (alreadyProcessed.bind(aSubShape, aSubShape)) {
+      // Store result.
+      ResultBodyPtr aResultBody = document()->createBody(data(), theResultIndex);
+      aResultBody->storeModified(theShape, aSubShape);
+      setResult(aResultBody, theResultIndex);
+      ++theResultIndex;
+    }
+  }
+
+  // 2. If need intersection points, perform Partition
+  if (isIntersect) {
+    // Partition
+    ListOfShape anObjList, aTools;
+    anObjList.push_back(theShape);
+    std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo (new GeomAlgoAPI_Partition(anObjList, aTools));
+
+    std::string anError;
+    if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aPartitionAlgo, getKind(), anError)) {
+      setError(anError);
+      return false;
+    }
+    GeomShapePtr aSplittedSketch = aPartitionAlgo->shape();
+
+    // Explode on Vertices, skip vertices of initial sketch
+    for (GeomAPI_ShapeExplorer anExp (aSplittedSketch, GeomAPI_Shape::VERTEX); anExp.more(); anExp.next()) {
+      GeomShapePtr aSubShape = anExp.current();
+
+      //if (!theShape->isSubShape(aSubShape)) { // skip vertices of initial sketch
+      if (alreadyProcessed.bind(aSubShape, aSubShape)) {
+        // Store result.
+        ResultBodyPtr aResultBody = document()->createBody(data(), theResultIndex);
+        aResultBody->storeGenerated(anObjList, aSubShape, aPartitionAlgo);
+        setResult(aResultBody, theResultIndex);
+        ++theResultIndex;
+      }
+    }
+  }
+
+  // 3. Add construction points (centers of circles, etc.)
+  for (int i = 0; i < nbSubs; i++) {
+    FeaturePtr aSubFeature = aComposite->subFeature(i);
+    const std::list<ResultPtr>& aSubResults = aSubFeature->results();
+    std::list<ResultPtr>::const_iterator anItRes = aSubResults.cbegin();
+    // Iterate on all sub-results
+    for (; anItRes != aSubResults.cend(); anItRes++) {
+      ResultPtr aRes = *anItRes;
+      if (aRes.get()) {
+        // Sub-result i
+        GeomShapePtr aSubResShape = aRes->shape();
+
+        for (GeomAPI_ShapeExplorer anExp (aSubResShape, GeomAPI_Shape::VERTEX); anExp.more(); anExp.next()) {
+          GeomShapePtr aSubShape = anExp.current();
+
+          if (alreadyProcessed.bind(aSubShape, aSubShape)) {
+            // Store result.
+            ResultBodyPtr aResultBody = document()->createBody(data(), theResultIndex);
+            aResultBody->storeModified(theShape, aSubShape);
+            setResult(aResultBody, theResultIndex);
+            ++theResultIndex;
+          }
+        }
+      }
+    }
+  }
+
+  return true;
+}
+
 void BuildPlugin_Vertex::execute()
 {
   // Get base objects list.
   AttributeSelectionListPtr aSelectionList = selectionList(BASE_OBJECTS_ID());
-  if(!aSelectionList.get()) {
+  if (!aSelectionList.get()) {
     setError("Error: Could not get selection list.");
     return;
   }
-  if(aSelectionList->size() == 0) {
+  if (aSelectionList->size() == 0) {
     setError("Error: Empty selection list.");
     return;
   }
 
-  // Collect base shapes.
-  ListOfShape aListOfShapes;
+  // Get "Compute intersections" flag value
+  bool isIntersect = false;
+  if (boolean(INTERSECT_ID()).get() && boolean(INTERSECT_ID())->isInitialized()) {
+    isIntersect = boolean(INTERSECT_ID())->value();
+  }
+
+  // Iterate arguments and build results
   int aResultIndex = 0;
-  for(int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
+  for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
     AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
     GeomShapePtr aShape = aSelection->value();
-    if(!aShape.get()) {
+    if (aShape.get()) {
+      // A shape selected
+      if (!buildVertices(aShape, isIntersect, aResultIndex)) return;
+    } else {
       ResultPtr aContext = aSelection->context();
-      if(!aContext.get()) {
-        setError("Error: Attribute has empty context.");
-        return;
+      if (aContext.get()) { // Result selected
+        FeaturePtr aFeature = ModelAPI_Feature::feature(aContext);
+        if (aFeature.get()) {
+          if (aFeature->getKind() == "Sketch") {
+            // Special processing for sketch to build center vertices etc.
+            if (!buildVertices(aFeature, isIntersect, aResultIndex)) return;
+          } else {
+            aShape = aContext->shape();
+            if (!buildVertices(aShape, isIntersect, aResultIndex)) return;
+          }
+        }
+      } else {
+        FeaturePtr aFeature = aSelection->contextFeature();
+        if (aFeature.get()) { // Feature selected
+          if (aFeature->getKind() == "Sketch") {
+            // Special processing for sketch to build center vertices etc.
+            if (!buildVertices(aFeature, isIntersect, aResultIndex)) return;
+          } else {
+            const std::list<ResultPtr>& anArgResults = aFeature->results();
+            std::list<ResultPtr>::const_iterator anItRes = anArgResults.cbegin();
+            // Iterate on all its results
+            for (; anItRes != anArgResults.cend(); anItRes++) {
+              ResultPtr aRes = *anItRes;
+              if (aRes.get()) {
+                // Result i
+                aShape = aRes->shape();
+                if (!buildVertices(aShape, isIntersect, aResultIndex)) return;
+              }
+            }
+          }
+        }
       }
-
-      aShape = aContext->shape();
     }
-    if(!aShape.get()) {
-      setError("Error: Empty shape selected.");
-      return;
-    }
-
-    if(aShape->shapeType() != GeomAPI_Shape::VERTEX) {
-      setError("Error: Selected shape has wrong type. Only vertices acceptable.");
-      return;
-    }
-
-    // Copy shape.
-    std::shared_ptr<GeomAlgoAPI_Copy> aCopyAlgo(new GeomAlgoAPI_Copy(aShape));
-
-    std::string anError;
-    if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aCopyAlgo, getKind(), anError)) {
-      setError(anError);
-      return;
-    }
-
-    // Store result.
-    ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
-    aResultBody->storeModified(aShape, aCopyAlgo->shape());
-    setResult(aResultBody, aResultIndex);
-    ++aResultIndex;
   }
 
+  // Remove extra results from previous execution
   removeResults(aResultIndex);
 }
index 62852d5e3a087b13fb93b4739741203c6bf3f901..d6dfa9c7814e880a940f2dd39030fe45f74ca721 100644 (file)
@@ -23,6 +23,7 @@
 #include "BuildPlugin.h"
 
 #include <ModelAPI_Feature.h>
+#include <GeomAPI_Shape.h>
 
 /// \class BuildPlugin_Vertex
 /// \ingroup Plugins
@@ -47,6 +48,13 @@ public:
     return MY_BASE_OBJECTS_ID;
   }
 
+  /// Attribute name of "Compute intersections" checkbox.
+  inline static const std::string& INTERSECT_ID()
+  {
+    static const std::string MY_INTERSECT_ID("intersect");
+    return MY_INTERSECT_ID;
+  }
+
   /// \return the kind of a feature.
   BUILDPLUGIN_EXPORT virtual const std::string& getKind()
   {
@@ -59,6 +67,15 @@ public:
 
   /// Creates a new part document if needed.
   BUILDPLUGIN_EXPORT virtual void execute();
+
+ protected:
+  bool buildVertices(GeomShapePtr theShape,
+                     bool isIntersect,
+                     int& theResultIndex);
+
+  bool buildVertices(FeaturePtr theFeature,
+                     bool isIntersect,
+                     int& theResultIndex);
 };
 
 #endif
diff --git a/src/BuildPlugin/BuildPlugin_msg_fr.ts b/src/BuildPlugin/BuildPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..61ea6f2
--- /dev/null
@@ -0,0 +1,1131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Build</source>
+      <translation>Construire</translation>
+    </message>
+    <message>
+      <source>CompSolid</source>
+      <translation>Solide Composite</translation>
+    </message>
+    <message>
+      <source>Compound</source>
+      <translation>Assemblage</translation>
+    </message>
+    <message>
+      <source>Edge</source>
+      <translation>Bord</translation>
+    </message>
+    <message>
+      <source>Face</source>
+      <translation>Face</translation>
+    </message>
+    <message>
+      <source>Filling</source>
+      <translation>Remplissage</translation>
+    </message>
+    <message>
+      <source>Interpolation</source>
+      <translation>Interpolation</translation>
+    </message>
+    <message>
+      <source>Polyline</source>
+      <translation>Polyligne</translation>
+    </message>
+    <message>
+      <source>Shell</source>
+      <translation>Coque</translation>
+    </message>
+    <message>
+      <source>Solid</source>
+      <translation>Solide</translation>
+    </message>
+    <message>
+      <source>Sub-Shapes</source>
+      <translation>Sous-formes</translation>
+    </message>
+    <message>
+      <source>Vertex</source>
+      <translation>Sommet</translation>
+    </message>
+    <message>
+      <source>Wire</source>
+      <translation>Contour</translation>
+    </message>
+  </context>
+
+  <!-- Validators -->
+
+  <context>
+    <name>Edge:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Attribute have empty context.</source>
+      <translation>Objet sélectionné non valide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty shape selected.</source>
+      <translation>Forme vide sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Infinite objects not acceptable.</source>
+      <translation>Les objets infinis ne sont pas acceptés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:first_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:second_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un deuxième point</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Face:BuildPlugin_ValidatorBaseForFace</name>
+    <message>
+      <source>Empty attribute \"%1\".</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+    <message>
+      <source>Objects not selected.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+    <message>
+      <source>Error while checking if edges intersects.</source>
+      <translation>Erreur lors de la vérification de l&apos;intersection des arêtes.</translation>
+    </message>
+    <message>
+      <source>Selected objects have intersections.</source>
+      <translation>Les objets sélectionnés ont des intersections.</translation>
+    </message>
+    <message>
+      <source>Selected object(s) should belong to only one plane.</source>
+      <translation>Les objets sélectionnés doivent appartenir à un seul plan.</translation>
+    </message>
+    <message>
+      <source>Selected objects do not generate closed contour.</source>
+      <translation>Les objets sélectionnés ne génèrent pas un contour fermé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Attribute have empty context.</source>
+      <translation>Objet sélectionné non valide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty shape selected.</source>
+      <translation>Forme vide sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Infinite objects not acceptable.</source>
+      <translation>Les objets infinis ne sont pas acceptés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Shell:base_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Objet sélectionné non valide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SubShapes:subshapes:BuildPlugin_ValidatorSubShapesSelection</name>
+    <message>
+      <source>Could not get selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:subshapes:BuildPlugin_ValidatorSubShapesSelection</name>
+    <message>
+      <source>Base shape is empty.</source>
+      <translation>Forme de base non sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:subshapes:BuildPlugin_ValidatorSubShapesSelection</name>
+    <message>
+      <source>Empty attribute in list.</source>
+      <translation>Objet sélectionné non valide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:subshapes:BuildPlugin_ValidatorSubShapesSelection</name>
+    <message>
+      <source>Selected shape has unacceptable type.</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:subshapes:BuildPlugin_ValidatorSubShapesSelection</name>
+    <message>
+      <source>Selected shape is not inside base face.</source>
+      <translation>La forme sélectionnée n&apos;est pas à l&apos;intérieur de la base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_shape" is not initialized.</source>
+      <translation>Forme de base non sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Forme de base non sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "subshapes" is not initialized.</source>
+      <translation>Sous-formes non sélectionnées.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>La forme de base devrait être l’un des types suivants: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Objet sélectionné non valide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Forme de base non sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Forme de base non sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Forme de base non sélectionnée.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Attribute have empty context.</source>
+      <translation>Objet sélectionné non valide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty shape selected.</source>
+      <translation>Forme vide sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Infinite objects not acceptable.</source>
+      <translation>Les objets infinis ne sont pas acceptés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Wire:BuildPlugin_ValidatorBaseForWire</name>
+    <message>
+      <source>Empty attribute \"%1\".</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:BuildPlugin_ValidatorBaseForWire</name>
+    <message>
+      <source>Result wire empty. Probably it has disconnected edges or non-manifold.</source>
+      <translation>Résultat contour vide. Probablement il possède des bords déconnectés ou non-manifold.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection list.</source>
+      <translation>Impossible d&apos;obtenir la liste de sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Could not get selection.</source>
+      <translation>Impossible d&apos;obtenir la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Attribute have empty context.</source>
+      <translation>Les attributs ont un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty shape selected.</source>
+      <translation>Forme vide sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Infinite objects not acceptable.</source>
+      <translation>Les objets infinis ne sont pas acceptés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l'un des suivants : %1</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Filling:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Attribute "%1" should contain at least %2 items.</source>
+      <translation>La liste des segments et des contours doit contenir au moins 2 éléments.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Polyline:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Attribute "%1" should contain at least %2 items.</source>
+      <translation>La liste de points doit contenir au moins 2 éléments</translation>
+    </message>
+  </context>
+  <context>
+    <name>Model_Data</name>
+    <message>
+      <source>Error: Result polyline has self-intersections.</source>
+      <translation>La polyligne a des auto-intersections.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Polyline</name>
+    <message>
+      <source>Error: Result polyline has self-intersections.</source>
+      <translation>La polyligne a des auto-intersections.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Interpolation:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Attribute "%1" should contain at least %2 items.</source>
+      <translation>La liste de points doit contenir au moins 2 éléments</translation>
+    </message>
+  </context>
+  <context>
+    <name>Interpolation:tangent_end</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le vecteur tangent à la fin de la courbe</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>CompSolid</name>
+    <message>
+      <source>CompSolid</source>
+      <translation>Solide Composite</translation>
+    </message>
+    <message>
+      <source>Create a compsolid from solids or other compsolids</source>
+      <translation>Créer un solide composite à partir de solides ou d&apos;autres solides composites</translation>
+    </message>
+  </context>
+  <context>
+    <name>CompSolid:BuildPlugin_ValidatorBaseForSolids</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Liste de sélection vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>CompSolid:base_objects</name>
+    <message>
+      <source>Select solids or compsolids.</source>
+      <translation>Sélectionnez des solides ou des solides composites.</translation>
+    </message>
+    <message>
+      <source>Solids and CompSolids:</source>
+      <translation>Solides et Solides Composites:</translation>
+    </message>
+  </context>
+  <context>
+    <name>CompSolid:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Liste de sélection vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>CompSolid:BuildPlugin_ValidatorBaseForSolids</name>
+    <message>
+      <source>Unable to build a solid</source>
+      <translation>Impossible de créer un solide.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Compound</name>
+    <message>
+      <source>Compound</source>
+      <translation>Assemblage</translation>
+    </message>
+    <message>
+      <source>Create a compound of objects</source>
+      <translation>Créer un assemblage</translation>
+    </message>
+  </context>
+  <context>
+    <name>Compound:base_objects</name>
+    <message>
+      <source>Objects:</source>
+      <translation>Objets:</translation>
+    </message>
+    <message>
+      <source>Select any kind of objects.</source>
+      <translation>Sélectionnez n&apos;importe quel type d&apos;objets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Compound:base_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionner des objets de base.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Edge</name>
+    <message>
+      <source>Create edges from sketch edges or other edge objects</source>
+      <translation>Créer des arêtes à partir d&apos;arêtes d&apos;esquisse ou d&apos;autres objets d&apos;arête</translation>
+    </message>
+    <message>
+      <source>Edge</source>
+      <translation>Bord</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:base_objects</name>
+    <message>
+      <source>Edges:</source>
+      <translation>Arêtes:</translation>
+    </message>
+    <message>
+      <source>Select edges on sketch or edges objects.</source>
+      <translation>Sélectionner des arêtes sur des objets d&apos;esquisse ou d&apos;arêtes.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:creation_method</name>
+    <message>
+      <source>By segments</source>
+      <translation>Par segments</translation>
+    </message>
+    <message>
+      <source>By two points</source>
+      <translation>Par deux points</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:first_point</name>
+    <message>
+      <source>First point</source>
+      <translation>Premier point</translation>
+    </message>
+    <message>
+      <source>Select a first point</source>
+      <translation>Sélectionnez un premier point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:first_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:second_point</name>
+    <message>
+      <source>Second point</source>
+      <translation>Deuxième point</translation>
+    </message>
+    <message>
+      <source>Select a second point</source>
+      <translation>Sélectionnez un deuxième point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Edge:second_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Face</name>
+    <message>
+      <source>Create a face from edges, wires and faces</source>
+      <translation>Créer une face à partir d&apos;arêtes, de contours et de faces</translation>
+    </message>
+    <message>
+      <source>Face</source>
+      <translation>Face</translation>
+    </message>
+  </context>
+  <context>
+    <name>Face:base_objects</name>
+    <message>
+      <source>Objects:</source>
+      <translation>Objets:</translation>
+    </message>
+    <message>
+      <source>Select edges, wires or faces.</source>
+      <translation>Sélectionnez des arêtes, des contours ou des faces.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Filling</name>
+    <message>
+      <source>Create face from list of edges</source>
+      <translation>Créer une face à partir d&apos;une liste d&apos;arêtes</translation>
+    </message>
+    <message>
+      <source>Filling</source>
+      <translation>Remplissage</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:advanced_options</name>
+    <message>
+      <source>Advanced options</source>
+      <translation>Options avancées</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:approximation</name>
+    <message>
+      <source>Approximation</source>
+      <translation>Approximation</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:base_objects</name>
+    <message>
+      <source>Segments and wires:</source>
+      <translation>Segments et contours:</translation>
+    </message>
+    <message>
+      <source>Select edges or wires.</source>
+      <translation>Sélectionnez des arêtes ou des contours.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:max_degree</name>
+    <message>
+      <source>Max deg</source>
+      <translation>Max deg</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:min_degree</name>
+    <message>
+      <source>Min deg</source>
+      <translation>Min deg</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:nb_iter</name>
+    <message>
+      <source>Nb iter</source>
+      <translation>Nb iter</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:orientation</name>
+    <message>
+      <source>Auto-correct edges orientation</source>
+      <translation>Correction automatique de l&apos;orientation des bords</translation>
+    </message>
+    <message>
+      <source>Use curve information</source>
+      <translation>Utiliser les informations de la courbe</translation>
+    </message>
+    <message>
+      <source>Use edges orientation</source>
+      <translation>Utiliser l&apos;orientation des bords</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:tol_2d</name>
+    <message>
+      <source>Tol 2D</source>
+      <translation>Tol 2D</translation>
+    </message>
+  </context>
+  <context>
+    <name>Filling:tol_3d</name>
+    <message>
+      <source>Tol 3D</source>
+      <translation>Tol 3D</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Interpolation</name>
+    <message>
+      <source>Create an interpolation curve from points</source>
+      <translation>Créer une courbe d&apos;interpolation à partir de points</translation>
+    </message>
+    <message>
+      <source>Interpolation</source>
+      <translation>Interpolation</translation>
+    </message>
+  </context>
+  <context>
+    <name>Interpolation:base_objects</name>
+    <message>
+      <source>Points and vertices:</source>
+      <translation>Points et sommets:</translation>
+    </message>
+    <message>
+      <source>Select points or vertices objects.</source>
+      <translation>Sélectionner des points ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Interpolation:closed</name>
+    <message>
+      <source>Closed</source>
+      <translation>Fermé</translation>
+    </message>
+  </context>
+  <context>
+    <name>Interpolation:reorder</name>
+    <message>
+      <source>Changes the order of points to construct the shortest curve.</source>
+      <translation>Change l&apos;ordre des points pour construire la courbe la plus courte.</translation>
+    </message>
+    <message>
+      <source>Reorder</source>
+      <translation>Réorganiser</translation>
+    </message>
+  </context>
+  <context>
+    <name>Interpolation:tangent_end</name>
+    <message>
+      <source>&lt;end&gt;</source>
+      <translation>&lt;fin&gt;</translation>
+    </message>
+    <message>
+      <source>End</source>
+      <translation>Fin</translation>
+    </message>
+    <message>
+      <source>Select vector tangent to the end of curve</source>
+      <translation>Sélectionnez le vecteur tangent à la fin de la courbe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Interpolation:tangent_start</name>
+    <message>
+      <source>&lt;start&gt;</source>
+      <translation>&lt;début&gt;</translation>
+    </message>
+    <message>
+      <source>Select vector tangent to the start of curve</source>
+      <translation>Sélectionnez le vecteur tangent au début de la courbe</translation>
+    </message>
+    <message>
+      <source>Start</source>
+      <translation>Début</translation>
+    </message>
+  </context>
+  <context>
+    <name>Interpolation:use_tangents</name>
+    <message>
+      <source>Tangents</source>
+      <translation>Tangentes</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Polyline</name>
+    <message>
+      <source>Create a polyline from points</source>
+      <translation>Créer une polyligne à partir de points</translation>
+    </message>
+    <message>
+      <source>Polyline</source>
+      <translation>Polyligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>Polyline:base_objects</name>
+    <message>
+      <source>Points and vertices:</source>
+      <translation>Points et sommets:</translation>
+    </message>
+    <message>
+      <source>Select points or vertices objects.</source>
+      <translation>Sélectionner des points ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Polyline:closed</name>
+    <message>
+      <source>Closed</source>
+      <translation>Fermé</translation>
+    </message>
+    <message>
+      <source>Closes the polyline.</source>
+      <translation>Ferme la polyligne.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Shell</name>
+    <message>
+      <source>Create a shell from faces or shells objects</source>
+      <translation>Créer une coque à partir d&apos;objets faces ou coques</translation>
+    </message>
+    <message>
+      <source>Shell</source>
+      <translation>Coque</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects</name>
+    <message>
+      <source>Faces and shells:</source>
+      <translation>Faces et coques:</translation>
+    </message>
+    <message>
+      <source>Select faces or shells objects.</source>
+      <translation>Sélectionner des objets faces ou coques.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Shell:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Liste de sélection vide.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Solid</name>
+    <message>
+      <source>Create a solid from faces or shells</source>
+      <translation>Créer un solide à partir de faces ou de coques</translation>
+    </message>
+    <message>
+      <source>Solid</source>
+      <translation>Solide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Solid:BuildPlugin_ValidatorBaseForSolids</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Liste de sélection vide.</translation>
+    </message>
+    <message>
+      <source>Unable to build a solid</source>
+      <translation>Impossible de construire un solide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Solid:base_objects</name>
+    <message>
+      <source>Faces and shells:</source>
+      <translation>Faces et coques:</translation>
+    </message>
+    <message>
+      <source>Select faces or shells.</source>
+      <translation>Sélectionnez des faces ou des coques.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Solid:base_objects:BuildPlugin_ValidatorBaseForBuild</name>
+    <message>
+      <source>Empty selection list.</source>
+      <translation>Liste de sélection vide.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SubShapes</name>
+    <message>
+      <source>Allows to add or to remove sub-shapes of the selected shape</source>
+      <translation>Permet d&apos;ajouter ou de supprimer des sous-formes de la forme sélectionnée</translation>
+    </message>
+    <message>
+      <source>Sub-Shapes</source>
+      <translation>Sous-formes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:base_shape</name>
+    <message>
+      <source>Select a shape to modify.</source>
+      <translation>Sélectionnez une forme à modifier.</translation>
+    </message>
+    <message>
+      <source>Shape:</source>
+      <translation>Forme:</translation>
+    </message>
+  </context>
+  <context>
+    <name>SubShapes:subshapes</name>
+    <message>
+      <source>Select shapes on sketch to add.</source>
+      <translation>Sélectionnez des formes sur l&apos;esquisse à ajouter.</translation>
+    </message>
+    <message>
+      <source>Sub-Shapes:</source>
+      <translation>Sous-formes:</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Vertex</name>
+    <message>
+      <source>Create vertices from sketch point or other vertex objects</source>
+      <translation>Créer des sommets à partir d&apos;un point d&apos;esquisse ou d&apos;autres objets de sommet</translation>
+    </message>
+    <message>
+      <source>Vertex</source>
+      <translation>Sommet</translation>
+    </message>
+  </context>
+  <context>
+    <name>Vertex:base_objects</name>
+    <message>
+      <source>Select vertices on sketch or vertex objects.</source>
+      <translation>Sélectionnez des sommets de l&apos;esquisse ou des objets sommet.</translation>
+    </message>
+    <message>
+      <source>Vertices:</source>
+      <translation>Sommets:</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Wire</name>
+    <message>
+      <source>Create a wire from sketch edges, edges and wires objects</source>
+      <translation>Créer un contour à partir d&apos;arêtes de l’esquisse, d&apos;arêtes et de contours</translation>
+    </message>
+    <message>
+      <source>Wire</source>
+      <translation>Contour</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:add_contour</name>
+    <message>
+      <source>Add contour</source>
+      <translation>Ajouter un contour</translation>
+    </message>
+    <message>
+      <source>Adds to the list of segments other segments of the sketcher connected to the already selected ones to create a closed contour.</source>
+      <translation>Ajoute à la liste des segments d&apos;autres segments de l&apos;esquisse connectés à ceux déjà sélectionnés pour créer un contour fermé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Wire:base_objects</name>
+    <message>
+      <source>Segments and wires:</source>
+      <translation>Segments et contours:</translation>
+    </message>
+    <message>
+      <source>Select edges on sketch, edges or wires objects.</source>
+      <translation>Sélectionner des arêtes sur des objets d&apos;esquisse, d&apos;arêtes ou de contours.</translation>
+    </message>
+  </context>
+
+</TS>
index 25bc5a01310fe54987e856066887768cbaffd885..1d1bf847c3e963a26d1c39f3f9229e4d569aa4c6 100644 (file)
@@ -83,6 +83,7 @@ SET(XML_RESOURCES
 
 SET(TEXT_RESOURCES
     BuildPlugin_msg_en.ts
+    BuildPlugin_msg_fr.ts
 )
 
 SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
index c9fcd95441450738029112b7f5c66ffbb70084c3..e2b9369902f8236ba6d9322a1eb392bdf62f8985 100644 (file)
@@ -81,7 +81,7 @@ aVertexFeature2 = aPart.addFeature("Vertex")
 aBaseObjectsList = aVertexFeature2.selectionList("base_objects")
 aBaseObjectsList.append(aSketchResult, None)
 aSession.finishOperation()
-assert (len(aVertexFeature2.results()) == 0)
+assert (len(aVertexFeature2.results()) == 10)
 
 aSession.startOperation()
 aLine = aSketchFeature.addFeature("SketchLine")
@@ -94,11 +94,14 @@ aBaseObjectsList.append(aSketchResult, aLine.lastResult().shape())
 aSession.finishOperation()
 assert (len(aVertexFeature2.results()) == 0)
 
+# Check Vertex feature failed on incorrect input
+# TODO
+
 # remove failed feature
-aSession.startOperation()
-aPart.removeFeature(aVertexFeature2)
-aPart.setCurrentFeature(aVertexFeature, True)
-aSession.finishOperation()
+#aSession.startOperation()
+#aPart.removeFeature(aVertexFeature2)
+#aPart.setCurrentFeature(aVertexFeature, True)
+#aSession.finishOperation()
 
 from salome.shaper import model
 assert(model.checkPythonDump())
index 77af0a18f5aeec634dc2270fd1abfd3fdace7e04..14ef22749b1520dfee0f0a2a2f3aea9b5e0d822f 100644 (file)
@@ -1,8 +1,10 @@
 <source>
   <multi_selector id="base_objects"
-                  label="Vertices:"
-                  tooltip="Select vertices on sketch or vertex objects."
-                  shape_types="vertices"
+                  label="Vertices and sketches:"
+                  tooltip="Select vertices or sketch objects or features."
+                  shape_types="vertices objects"
                   concealment="true">
+    <validator id="BuildPlugin_ValidatorBaseForVertex"/>
   </multi_selector>
+  <boolvalue id="intersect" label="Compute intersections" tooltip="Compute intersections of all sketch edges." default="false"/>
 </source>
index 619c42de6284887177ffd626120824aadfd20f31..3b0fa573835718391690387346eb2feead4aebea 100644 (file)
@@ -68,6 +68,7 @@ SET(XML_RESOURCES
 
 SET(TEXT_RESOURCES
     CollectionPlugin_msg_en.ts
+    CollectionPlugin_msg_fr.ts
 )
 
 # sources / moc wrappings
diff --git a/src/CollectionPlugin/CollectionPlugin_msg_fr.ts b/src/CollectionPlugin/CollectionPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..2cdd311
--- /dev/null
@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Field</source>
+      <translation>Champ</translation>
+    </message>
+    <message>
+      <source>Group</source>
+      <translation>Groupe</translation>
+    </message>
+    <message>
+      <source>Group Addition</source>
+      <translation>Addition de groupes</translation>
+    </message>
+    <message>
+      <source>Group Intersection</source>
+      <translation>Intersection de groupes</translation>
+    </message>
+    <message>
+      <source>Group Substraction</source>
+      <translation>Soustraction de groupes</translation>
+    </message>
+  </context>
+
+  <!-- Field -->
+  <context>
+    <name>Field</name>
+    <message>
+      <source>Create fields for selected shapes</source>
+      <translation>Créer des champs pour les formes sélectionnées</translation>
+    </message>
+    <message>
+      <source>Field</source>
+      <translation>Champ</translation>
+    </message>
+  </context>
+  <context>
+    <name>Field:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "components_names" is not initialized.</source>
+      <translation>Les composants ne sont pas sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>Field:CollectionPlugin_FieldValidator</name>
+    <message>
+      <source>Selection list is not initialized</source>
+      <translation>La liste de sélection n&apos;est pas initialisée</translation>
+    </message>
+  </context>
+
+  <!-- Group -->
+  <context>
+    <name>Group</name>
+    <message>
+      <source>Create named collection of geometry entities</source>
+      <translation>Créer une collection nommée d&apos;entités géométriques</translation>
+    </message>
+    <message>
+      <source>Group</source>
+      <translation>Groupe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Group:group_list</name>
+    <message>
+      <source>Select a set of objects</source>
+      <translation>Sélectionnez un ensemble d&apos;objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Group:group_list:GeomValidators_BodyShapes</name>
+    <message>
+      <source>Error: Context is empty.</source>
+      <translation>L&apos;objet sélectionné a un contexte vide.</translation>
+    </message>
+    <message>
+      <source>Error: Result construction selected.</source>
+      <translation>Constructions non autorisées pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Group:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "group_list" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Group:name</name>
+    <message>
+      <source>Name</source>
+      <translation>Nom</translation>
+    </message>
+    <message>
+      <source>Please input the group name</source>
+      <translation>S&apos;il vous plaît entrer le nom du groupe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Group:group_list</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un ensemble d&apos;objets.</translation>
+    </message>
+  </context>
+
+  <!-- GroupAddition -->
+  <context>
+    <name>GroupAddition</name>
+    <message>
+      <source>Group Addition</source>
+      <translation>Addition de groupes</translation>
+    </message>
+    <message>
+      <source>Join several groups to single group</source>
+      <translation>Joindre plusieurs groupes pour former un seul groupe</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupAddition:group_list</name>
+    <message>
+      <source>Base groups:</source>
+      <translation>Groupes de base:</translation>
+    </message>
+    <message>
+      <source>Select a set of groups</source>
+      <translation>Sélectionnez un ensemble de groupes</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupAddition:name</name>
+    <message>
+      <source>Name</source>
+      <translation>Nom</translation>
+    </message>
+    <message>
+      <source>Please input the group name</source>
+      <translation>S&apos;il vous plaît entrer le nom du groupe</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupAddition:group_list</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un ensemble de groupes.</translation>
+    </message>
+  </context>
+
+  <!-- GroupIntersection -->
+  <context>
+    <name>GroupIntersection</name>
+    <message>
+      <source>Get elements existing in all groups</source>
+      <translation>Obtenir les éléments existants dans tous les groupes</translation>
+    </message>
+    <message>
+      <source>Group Intersection</source>
+      <translation>Intersection de groupes</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupIntersection:EmptyResult</name>
+    <message>
+      <source>Error: Empty result.</source>
+      <translation>Erreur : résultat vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupIntersection:group_list</name>
+    <message>
+      <source>Base groups:</source>
+      <translation>Groupes de base:</translation>
+    </message>
+    <message>
+      <source>Select a set of groups</source>
+      <translation>Sélectionnez un ensemble de groupes</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupIntersection:name</name>
+    <message>
+      <source>Name</source>
+      <translation>Nom</translation>
+    </message>
+    <message>
+      <source>Please input the group name</source>
+      <translation>S&apos;il vous plaît entrer le nom du groupe</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupIntersection:group_list</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un ensemble de groupes.</translation>
+    </message>
+  </context>
+
+  <!-- GroupSubstraction -->
+  <context>
+    <name>GroupSubstraction</name>
+    <message>
+      <source>Exclude elements existing tool groups</source>
+      <translation>Exclure des éléments des groupes d&apos;outils existants</translation>
+    </message>
+    <message>
+      <source>Group Substraction</source>
+      <translation>Soustraction de groupes</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupSubstraction:group_list</name>
+    <message>
+      <source>Main groups:</source>
+      <translation>Groupes principaux:</translation>
+    </message>
+    <message>
+      <source>Select a set of groups</source>
+      <translation>Sélectionnez un ensemble de groupes</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupSubstraction:name</name>
+    <message>
+      <source>Name</source>
+      <translation>Nom</translation>
+    </message>
+    <message>
+      <source>Please input the group name</source>
+      <translation>S&apos;il vous plaît entrer le nom du groupe</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupSubstraction:tools_list</name>
+    <message>
+      <source>Select a set of groups</source>
+      <translation>Sélectionnez un ensemble de groupes</translation>
+    </message>
+    <message>
+      <source>Tool groups:</source>
+      <translation>Groupes d&apos;outils:</translation>
+    </message>
+  </context>
+  <context>
+    <name>GroupSubstraction:group_list</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un ensemble de groupes.</translation>
+    </message>
+  </context>
+
+</TS>
index 0a8f4aba4f06bbc7a154385ca958a818146a6951..32132a196ae9e6ceddf68367e570e4f8d8ca49e8 100644 (file)
@@ -104,6 +104,7 @@ const static char* ATTR_GREED = "greed";
 const static char* ATTR_MODIFIED_IN_EDIT = "modified_in_edit";
 const static char* ATTR_MAIN_ARG = "main_argument";
 const static char* ATTR_GEOMETRICAL_SELECTION = "geometrical_selection";
+const static char* ATTR_VISUAL_CHANGED = "change_visual_attributes";
 
 
 // WDG_INFO properties
index 7d588bfa1c6ed508b3620a67755b9c73197b9ea5..17a885057e9dfb3f69597e62025ea52b74b426b0 100644 (file)
@@ -29,7 +29,7 @@ SET(XML_RESOURCES
 )
 
 SET(TEXT_RESOURCES
-#    ConnectorPlugin_msg_fr.ts
+    ConnectorPlugin_msg_fr.ts
 )
 
 SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
diff --git a/src/ConnectorPlugin/ConnectorPlugin_msg_fr.ts b/src/ConnectorPlugin/ConnectorPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..b8e1535
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+  <context>
+    <name>ExportToGEOM</name>
+    <message>
+      <source>Export all results and groups into GEOM module</source>
+      <translation>Exporter tous les résultats et groupes dans le module GEOM</translation>
+    </message>
+    <message>
+      <source>Export to GEOM</source>
+      <translation>Exporter vers GEOM</translation>
+    </message>
+  </context>
+</TS>
index b3fd7497ab883a55a07ae8ceba9d952718d2efc9..391b0ee0437f6d2325e7aa0927908b3de9a7af2a 100644 (file)
@@ -46,6 +46,7 @@ SET(XML_RESOURCES
 
 SET(TEXT_RESOURCES
   ConstructionPlugin_msg_en.ts
+  ConstructionPlugin_msg_fr.ts
 )
 
 SET(PROJECT_LIBRARIES
diff --git a/src/ConstructionPlugin/ConstructionPlugin_msg_fr.ts b/src/ConstructionPlugin/ConstructionPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..c4b158d
--- /dev/null
@@ -0,0 +1,1215 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Construction</source>
+      <translation>Construction</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CylindricalFace:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;axe par face fait référence à un type de forme non acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CylindricalFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a face.</source>
+      <translation>L&apos;axe par face ne peut être créé que sur une face</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CylindricalFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a plane.</source>
+      <translation>L&apos;axe par face ne peut être créé que sur une face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CylindricalFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>L&apos;axe par face ne peut être créé que sur une face cylindrique</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CylindricalFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>L&apos;axe par une face ne peut pas être créé sur la face sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "FirstPoint" is not initialized.</source>
+      <translation>Sélectionnez le premier point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "SecondPoint" is not initialized.</source>
+      <translation>Sélectionnez le deuxième point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "CylindricalFace" is not initialized.</source>
+      <translation>Sélectionnez la face cylindrique</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Seule la sélection d&apos;attribut peut être utilisée pour le premier point, pas %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le premier point fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>Uses composite construction feature without sub-features.</source>
+      <translation>Le premier point utilise une fonctionnalité de construction composite sans sous-fonctionnalités</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le premier point ne contient pas d&apos;élément avec un type de forme acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le premier point ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le premier point fait référence à %1 mais doit être %2</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Le premier point de type %1 n&apos;est pas pris en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le premier point fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le premier point fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Le premier point fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Seule la sélection d&apos;attribut peut être utilisée pour le deuxième point, pas %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le deuxième point fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>Uses composite construction feature without sub-features.</source>
+      <translation>Le deuxième point utilise une fonctionnalité de construction composite sans sous-fonctionnalités</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le deuxième point ne contient pas d&apos;élément de type de forme acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le deuxième point ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPointGeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le deuxième point fait référence à %1 mais doit être %2</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Le deuxième point de type %1 n&apos;est pas pris en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le deuxième point fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le deuxième point fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Le deuxième point fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint:GeomValidators_DifferentShapes</name>
+    <message>
+      <source>The feature uses equal shapes.</source>
+      <translation>Les points d&apos;axe doivent être différents</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:DZ</name>
+    <message>
+      <source>DZ </source>
+      <translation>DZ </translation>
+    </message>
+    <message>
+      <source>Z dimension</source>
+      <translation>Dimension Z</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint</name>
+    <message>
+      <source>First point</source>
+      <translation>Premier point</translation>
+    </message>
+    <message>
+      <source>Select a first point</source>
+      <translation>Sélectionnez un premier point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:SecondPoint</name>
+    <message>
+      <source>Second point</source>
+      <translation>Deuxième point</translation>
+    </message>
+    <message>
+      <source>Select a second point</source>
+      <translation>Sélectionnez un deuxième point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:line</name>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+    <message>
+      <source>Select line.</source>
+      <translation>Sélectionnez une ligne.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:line:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:offset1</name>
+    <message>
+      <source>Distance </source>
+      <translation>Distance </translation>
+    </message>
+    <message>
+      <source>Distance value</source>
+      <translation>Distance</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:offset2</name>
+    <message>
+      <source>Distance </source>
+      <translation>Distance </translation>
+    </message>
+    <message>
+      <source>Distance value</source>
+      <translation>Distance</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:plane</name>
+    <message>
+      <source>Plane</source>
+      <translation>Plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:plane1</name>
+    <message>
+      <source>1st plane</source>
+      <translation>1er plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:plane1:ConstructionPlugin_ValidatorAxisTwoNotParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:plane2</name>
+    <message>
+      <source>2nd plane</source>
+      <translation>2nd plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:plane2:ConstructionPlugin_ValidatorAxisTwoNotParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:point</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+    <message>
+      <source>Select point.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:reverse_offset1</name>
+    <message>
+      <source>Reverse</source>
+      <translation>Sens inverse</translation>
+    </message>
+    <message>
+      <source>Reverse offset value</source>
+      <translation>Valeur de décalage inverse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:reverse_offset2</name>
+    <message>
+      <source>Reverse</source>
+      <translation>Sens inverse</translation>
+    </message>
+    <message>
+      <source>Reverse offset value</source>
+      <translation>Valeur de décalage inverse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:use_offset1</name>
+    <message>
+      <source>Offset from 1st plane</source>
+      <translation>Décalage du 1er plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:use_offset2</name>
+    <message>
+      <source>Offset from 2nd plane</source>
+      <translation>Décalage du 2e plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Create axis</source>
+      <translation>Créer un axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CylindricalFace</name>
+    <message>
+      <source>Main object</source>
+      <translation>Objet principal</translation>
+    </message>
+    <message>
+      <source>Select a cylindrical object</source>
+      <translation>Sélectionnez un objet cylindrique</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:DX</name>
+    <message>
+      <source>DX </source>
+      <translation>DX </translation>
+    </message>
+    <message>
+      <source>X dimension</source>
+      <translation>Dimension X</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:DY</name>
+    <message>
+      <source>DY </source>
+      <translation>DY </translation>
+    </message>
+    <message>
+      <source>Y dimension</source>
+      <translation>Dimension Y</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CreationMethod</name>
+    <message>
+      <source>As axis of cylindrical face</source>
+      <translation>Comme axe de face cylindrique</translation>
+    </message>
+    <message>
+      <source>By line</source>
+      <translation>Par une ligne</translation>
+    </message>
+    <message>
+      <source>By plane and point</source>
+      <translation>Par un plan et un point</translation>
+    </message>
+    <message>
+      <source>By three dimensions</source>
+      <translation>Par trois dimensions</translation>
+    </message>
+    <message>
+      <source>By two planes</source>
+      <translation>Par deux plans</translation>
+    </message>
+    <message>
+      <source>By two points</source>
+      <translation>Par deux points</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:CylindricalFace</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un objet cylindrique.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:FirstPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un premier point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:line</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez une ligne.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:plane</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un plan.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Axis:plane1</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un plan.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Plane</source>
+      <translation>Plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:planeFace:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Le plan fait référence à un type de forme non acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:planeFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a face.</source>
+      <translation>Le plan ne peut être créé que sur une face</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:planeFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a plane.</source>
+      <translation>Le plan ne peut être créé que sur une face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:planeFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>Le plan ne peut être créé que sur une face cylindrique</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:planeFace:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>Le plan ne peut pas être créé sur la face sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "planeFace" is not initialized.</source>
+      <translation>Sélectionnez la face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "distance" is not initialized.</source>
+      <translation>Définir la distance</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane</name>
+    <message>
+      <source>Create plane</source>
+      <translation>Créer un plan</translation>
+    </message>
+    <message>
+      <source>Plane</source>
+      <translation>Plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angle for rotation around axis.</source>
+      <translation>Angle de rotation autour de l&apos;axe.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:axis</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select line for axis.</source>
+      <translation>Sélectionnez la ligne pour l&apos;axe.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:axis:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:by_other_plane_option</name>
+    <message>
+      <source>By coincident to point</source>
+      <translation>Par coïncidence au point</translation>
+    </message>
+    <message>
+      <source>By distance from other</source>
+      <translation>Par distance aux autres</translation>
+    </message>
+    <message>
+      <source>By rotation</source>
+      <translation>Par rotation</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:coincident_point</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+    <message>
+      <source>Select point.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:creation_method</name>
+    <message>
+      <source>By line and point</source>
+      <translation>Par une ligne et un point</translation>
+    </message>
+    <message>
+      <source>By other plane</source>
+      <translation>Par un autre plan</translation>
+    </message>
+    <message>
+      <source>By three points</source>
+      <translation>Par trois points</translation>
+    </message>
+    <message>
+      <source>By two parallel planes</source>
+      <translation>Par deux plans parallèles</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:distance</name>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+    <message>
+      <source>Distance from selected face to plane.</source>
+      <translation>Distance de la face sélectionnée au plan.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:line</name>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+    <message>
+      <source>Select line.</source>
+      <translation>Sélectionnez une ligne.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:line:ConstructionPlugin_ValidatorPlaneLinePoint</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:perpendicular</name>
+    <message>
+      <source>Makes the plane perpendicular to the selected line.</source>
+      <translation>Rend le plan perpendiculaire à la ligne sélectionnée.</translation>
+    </message>
+    <message>
+      <source>Perpendicular </source>
+      <translation>Perpendiculaire </translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:plane</name>
+    <message>
+      <source>Plane</source>
+      <translation>Plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:plane1</name>
+    <message>
+      <source>1st plane</source>
+      <translation>1er plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:plane1:ConstructionPlugin_ValidatorPlaneTwoParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:plane2</name>
+    <message>
+      <source>2nd plane</source>
+      <translation>2nd plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:plane2:ConstructionPlugin_ValidatorPlaneTwoParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+    <message>
+      <source>Select point.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point1</name>
+    <message>
+      <source>1st point</source>
+      <translation>1er point</translation>
+    </message>
+    <message>
+      <source>First point.</source>
+      <translation>Premier point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point1:ConstructionPlugin_ValidatorPlaneThreePoints</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point2</name>
+    <message>
+      <source>2nd point</source>
+      <translation>2ème point</translation>
+    </message>
+    <message>
+      <source>Second point.</source>
+      <translation>Deuxième point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point2:ConstructionPlugin_ValidatorPlaneThreePoints</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point3</name>
+    <message>
+      <source>3rd point</source>
+      <translation>3ème point</translation>
+    </message>
+    <message>
+      <source>Third point.</source>
+      <translation>Troisième point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point3:ConstructionPlugin_ValidatorPlaneThreePoints</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:point:ConstructionPlugin_ValidatorPlaneLinePoint</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Plane:reverse</name>
+    <message>
+      <source>Checked means on the other side of the selected plane.</source>
+      <translation>Coché signifie de l&apos;autre côté du plan sélectionné.</translation>
+    </message>
+    <message>
+      <source>Reverse</source>
+      <translation>Sens inverse</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point</name>
+    <message>
+      <source>Create point</source>
+      <translation>Créer un point</translation>
+    </message>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:distance</name>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+    <message>
+      <source>Distance value.</source>
+      <translation>Distance.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:edge</name>
+    <message>
+      <source>Edge</source>
+      <translation>Bord</translation>
+    </message>
+    <message>
+      <source>Edge for creating point on it.</source>
+      <translation>Arête où créer le point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:edge_for_point_projection</name>
+    <message>
+      <source>Edge for projection.</source>
+      <translation>Arête pour la projection.</translation>
+    </message>
+    <message>
+      <source>edge</source>
+      <translation>bord</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:face_for_point_projection</name>
+    <message>
+      <source>Face for projection.</source>
+      <translation>Face pour projection.</translation>
+    </message>
+    <message>
+      <source>face</source>
+      <translation>face</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_line</name>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+    <message>
+      <source>Line for intersection.</source>
+      <translation>Ligne d&apos;intersection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_line_1</name>
+    <message>
+      <source>First line</source>
+      <translation>Première ligne</translation>
+    </message>
+    <message>
+      <source>First line.</source>
+      <translation>Première ligne.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_line_1:ConstructionPlugin_ValidatorPointLines</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_line_2</name>
+    <message>
+      <source>Second line</source>
+      <translation>Deuxième ligne</translation>
+    </message>
+    <message>
+      <source>Second line.</source>
+      <translation>Deuxième ligne.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_line_2:ConstructionPlugin_ValidatorPointLines</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane</name>
+    <message>
+      <source>Plane</source>
+      <translation>Plan</translation>
+    </message>
+    <message>
+      <source>Plane for intersection.</source>
+      <translation>Plan d&apos;intersection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_1</name>
+    <message>
+      <source>1st plane</source>
+      <translation>1er plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_2</name>
+    <message>
+      <source>2nd plane</source>
+      <translation>2nd plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_3</name>
+    <message>
+      <source>3rd plane</source>
+      <translation>3ème plan</translation>
+    </message>
+    <message>
+      <source>Select a planar face.</source>
+      <translation>Sélectionnez une face plane.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:object_for_center_of_circle</name>
+    <message>
+      <source>Object</source>
+      <translation>Objet</translation>
+    </message>
+    <message>
+      <source>Object for center of circle.</source>
+      <translation>Objet pour le centre du cercle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:object_for_center_of_gravity</name>
+    <message>
+      <source>Object</source>
+      <translation>Objet</translation>
+    </message>
+    <message>
+      <source>Object for center of gravity.</source>
+      <translation>Objet pour le centre de gravité.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:offset</name>
+    <message>
+      <source>Distance </source>
+      <translation>Distance </translation>
+    </message>
+    <message>
+      <source>Distance from the plane</source>
+      <translation>Distance du plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:point_to_project</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+    <message>
+      <source>Point for projection.</source>
+      <translation>Point de projection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:ratio</name>
+    <message>
+      <source>Ratio</source>
+      <translation>Rapport</translation>
+    </message>
+    <message>
+      <source>Ratio value.</source>
+      <translation>Valeur du rapport.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:reverse</name>
+    <message>
+      <source>Distance from edge end point.</source>
+      <translation>Distance du point final du bord.</translation>
+    </message>
+    <message>
+      <source>Reverse</source>
+      <translation>Sens inverse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:reverse_offset</name>
+    <message>
+      <source>Reverse</source>
+      <translation>Sens inverse</translation>
+    </message>
+    <message>
+      <source>Reverse offset value</source>
+      <translation>Valeur de décalage inverse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:use_offset</name>
+    <message>
+      <source>Offset from the plane</source>
+      <translation>Décalage du plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "x" is not initialized.</source>
+      <translation>Sélectionnez la coordonnée x</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "y" is not initialized.</source>
+      <translation>Sélectionnez la coordonnée y</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "z" is not initialized.</source>
+      <translation>Sélectionnez la coordonnée z</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_line:ConstructionPlugin_ValidatorPointEdgeAndPlaneNotParallel</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane:ConstructionPlugin_ValidatorPointEdgeAndPlaneNotParallel</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_1:ConstructionPlugin_ValidatorPointThreeNonParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_2:ConstructionPlugin_ValidatorPointThreeNonParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_3:ConstructionPlugin_ValidatorPointThreeNonParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:object_for_center_of_circle:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:creation_method</name>
+    <message>
+      <source>By X, Y, Z</source>
+      <translation>Par X, Y, Z</translation>
+    </message>
+    <message>
+      <source>By distance on edge</source>
+      <translation>Par distance au bord</translation>
+    </message>
+    <message>
+      <source>By geometrical property of object</source>
+      <translation>Par propriété géométrique d&apos;objet</translation>
+    </message>
+    <message>
+      <source>By intersection of objects</source>
+      <translation>Par intersection d&apos;objets</translation>
+    </message>
+    <message>
+      <source>By projection on edge or plane</source>
+      <translation>Par projection sur un bord ou un plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:geometrical_property_type</name>
+    <message>
+      <source>By center of circle</source>
+      <translation>Par centre de cercle</translation>
+    </message>
+    <message>
+      <source>By center of gravity</source>
+      <translation>Par centre de gravité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_line:ConstructionPlugin_ValidatorPointEdgeAndPlaneNotParallel</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane:ConstructionPlugin_ValidatorPointEdgeAndPlaneNotParallel</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_1:ConstructionPlugin_ValidatorPointThreeNonParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_2:ConstructionPlugin_ValidatorPointThreeNonParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_plane_3:ConstructionPlugin_ValidatorPointThreeNonParallelPlanes</name>
+    <message>
+      <source>One of the attribute is not initialized.</source>
+      <translation>Un des attributs n’est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:intersection_type</name>
+    <message>
+      <source>By line and plane intersection</source>
+      <translation>Par intersection d’une ligne et d&apos;un plan</translation>
+    </message>
+    <message>
+      <source>By three planes intersection</source>
+      <translation>Par intersection de trois plans</translation>
+    </message>
+    <message>
+      <source>By two lines intersection</source>
+      <translation>Par intersection de deux lignes</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:offset_type</name>
+    <message>
+      <source>Distance on edge by ratio</source>
+      <translation>Distance au bord par ratio</translation>
+    </message>
+    <message>
+      <source>Distance on edge by value</source>
+      <translation>Distance au bord par valeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>Point:projection_type</name>
+    <message>
+      <source>By projection on edge</source>
+      <translation>Par projection sur une arête</translation>
+    </message>
+    <message>
+      <source>By projection on face</source>
+      <translation>Par projection sur la face</translation>
+    </message>
+  </context>
+</TS>
index aa09fbbee2c4db7980b22df440d9a19642c4346a..5b543e58c54c666c7905784776e3fed70eca732b 100644 (file)
 //
 
 /* Events.i */
-%module EventsAPI
+%module(directors="1") EventsAPI
+%feature("director:except") {
+    if ($error != NULL) {
+      PyErr_Print();
+      std::cerr << std::endl;
+      throw Swig::DirectorMethodException();
+    }
+}
+
 %{
   #include "Events.h"
   #include "Events_InfoMessage.h"
+  #include "Events_Listener.h"
+  #include "Events_Loop.h"
   #include "Events_Message.h"
+  #include "Events_MessageGroup.h"
 %}
 
 
 %include "typemaps.i"
 %include "std_string.i"
 
+// directors
+%feature("director") Events_Listener;
+
 // all supported interfaces
 %include "Events_Message.h"
 %include "Events_InfoMessage.h"
+%include "Events_Listener.h"
+%include "Events_Loop.h"
+%include "Events_MessageGroup.h"
index 07fd93f97996dfe14b1b57b60f33c19937574698..a7da686f67fe6d272141daf1fdb84a8ae829f985 100644 (file)
@@ -38,7 +38,9 @@ class Events_Listener {
   /// map from event ID to groupped messages (for flush for groupMessages=true listeners)
   std::map<char*, std::shared_ptr<Events_Message> > myGroups;
 
- public:
+public:
+  virtual ~Events_Listener() {}
+
   //! This method is called by loop when the event is started to process.
   EVENTS_EXPORT virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage) = 0;
 
index 222f2e6eaea1ac3bea1cbbb0aa44e8d0b8465cd8..2a9c196f4905e9b6f8c94b90d220c942ea0d66c9 100644 (file)
@@ -55,6 +55,7 @@ SET(XML_RESOURCES
 
 SET(TEXT_RESOURCES
     ExchangePlugin_msg_en.ts
+    ExchangePlugin_msg_fr.ts
 )
 
 SET(PROJECT_LIBRARIES
diff --git a/src/ExchangePlugin/ExchangePlugin_msg_fr.ts b/src/ExchangePlugin/ExchangePlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..930ee4c
--- /dev/null
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Dump</source>
+      <translation>Déverser</translation>
+    </message>
+    <message>
+      <source>Export</source>
+      <translation>Export</translation>
+    </message>
+    <message>
+      <source>Import</source>
+      <translation>Import</translation>
+    </message>
+  </context>
+
+  <!-- Dump -->
+  <context>
+    <name>Dump</name>
+    <message>
+      <source>Dump</source>
+      <translation>Déverser</translation>
+    </message>
+    <message>
+      <source>Dump Python script</source>
+      <translation>Déverser dans un script Python</translation>
+    </message>
+  </context>
+  <context>
+    <name>Dump:file_format</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut "%1" n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Dump:file_path</name>
+    <message>
+      <source>Dump to file</source>
+      <translation>Déverser dans un fichier</translation>
+    </message>
+  </context>
+  <context>
+    <name>Dump:file_path:ExchangePlugin_ExportFormat</name>
+    <message>
+      <source>File name is empty.</source>
+      <translation>Le nom du fichier est vide.</translation>
+    </message>
+  </context>
+
+  <!-- Export -->
+  <context>
+    <name>Export:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "file_format" is not initialized.</source>
+      <translation>Le nom du fichier d&apos;export n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "selection_list" is not initialized.</source>
+      <translation>Les objets à exporter ne sont pas sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:file_path:ExchangePlugin_ExportFormat</name>
+    <message>
+      <source>File name is empty.</source>
+      <translation>Le nom du fichier d&apos;export n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:selection_list:GeomValidators_Finite</name>
+    <message>
+      <source>Infinite result is selected.</source>
+      <translation>Seules les formes finies peuvent être exportées</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "file_path" is not initialized.</source>
+      <translation>Définir le chemin du fichier exporté</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "selection_list" is not initialized.</source>
+      <translation>Les objets à exporter ne sont pas sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "xao_file_path" is not initialized.</source>
+      <translation>Définir le chemin du fichier XAO exporté</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "xao_author" is not initialized.</source>
+      <translation>Définir l&apos;auteur du fichier XAO</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "xao_geometry_name" is not initialized.</source>
+      <translation>Définir le nom de la géométrie du fichier XAO</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:ExchangePlugin_ExportFormat</name>
+    <message>
+      <source>%1 is not initialized.</source>
+      <translation>L&apos;attribut %1 n&apos;est pas initialisé.</translation>
+    </message>
+    <message>
+      <source>%1 is not a string attribute.</source>
+      <translation>L&apos;attribut %1 n&apos;est pas une chaîne.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export</name>
+    <message>
+      <source>Export</source>
+      <translation>Export</translation>
+    </message>
+    <message>
+      <source>Export to file</source>
+      <translation>Exporter dans un fichier</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:ExportType</name>
+    <message>
+      <source>BREP, STEP, IGES</source>
+      <translation>BREP, STEP, IGES</translation>
+    </message>
+    <message>
+      <source>XAO</source>
+      <translation>XAO</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:file_path</name>
+    <message>
+      <source>Export file</source>
+      <translation>Fichier d&apos;export</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:selection_list</name>
+    <message>
+      <source>Select a set of objects</source>
+      <translation>Sélectionnez un ensemble d&apos;objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:xao_author</name>
+    <message>
+      <source>Author</source>
+      <translation>Auteur</translation>
+    </message>
+    <message>
+      <source>Please input the author</source>
+      <translation>S&apos;il vous plaît saisissez l&apos;auteur</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:xao_file_path</name>
+    <message>
+      <source>Export file</source>
+      <translation>Fichier d&apos;export</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:xao_file_path:ExchangePlugin_ExportFormat</name>
+    <message>
+      <source>%1 is not initialized.</source>
+      <translation>%1 n&apos;est pas initialisé.</translation>
+    </message>
+    <message>
+      <source>File name is empty.</source>
+      <translation>Le nom du fichier est vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Export:xao_geometry_name</name>
+    <message>
+      <source>Geometry name</source>
+      <translation>Nom de la géométrie</translation>
+    </message>
+    <message>
+      <source>Please input the geometry name</source>
+      <translation>S&apos;il vous plaît entrer le nom de la géométrie</translation>
+    </message>
+  </context>
+
+  <!-- Import -->
+  <context>
+    <name>Import:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "file_path" is not initialized.</source>
+      <translation>Nom du fichier d&apos;entrée à importer</translation>
+    </message>
+  </context>
+  <context>
+    <name>Import:file_path:ExchangePlugin_ImportFormat</name>
+    <message>
+      <source>File name is empty.</source>
+      <translation>Nom du fichier d&apos;entrée à importer</translation>
+    </message>
+  </context>
+  <context>
+    <name>Import</name>
+    <message>
+      <source>Import</source>
+      <translation>Import</translation>
+    </message>
+    <message>
+      <source>Import a file</source>
+      <translation>Importer un fichier</translation>
+    </message>
+  </context>
+  <context>
+    <name>Import:file_path</name>
+    <message>
+      <source>Import file</source>
+      <translation>Importer le fichier</translation>
+    </message>
+  </context>
+
+</TS>
index 934a9ae02e0c35113e8d653070896dbb6fd9f227..af4102734031cc1e34379f6061a6b9cfd9292c4e 100644 (file)
@@ -155,6 +155,8 @@ void FeaturesAPI_ExtrusionBoolean::dump(ModelHighAPI_Dumper& theDumper) const
 
     theDumper << ", " << anAttrToObject << ", " << anAttrToOffset <<
       ", " << anAttrFromObject << ", " << anAttrFromOffset;
+  } else {
+    // Through all
   }
 
   AttributeSelectionListPtr anAttrBoolObjects =
@@ -183,6 +185,20 @@ FeaturesAPI_ExtrusionCut::FeaturesAPI_ExtrusionCut(
   initialize();
 }
 
+//==================================================================================================
+FeaturesAPI_ExtrusionCut::FeaturesAPI_ExtrusionCut(
+  const std::shared_ptr<ModelAPI_Feature>& theFeature,
+  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+: FeaturesAPI_ExtrusionBoolean(theFeature)
+{
+  if(initialize()) {
+    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(FeaturesPlugin_Extrusion::CREATION_METHOD_THROUGH_ALL(), mycreationMethod);
+    setBooleanObjects(theBooleanObjects);
+  }
+}
+
 //==================================================================================================
 FeaturesAPI_ExtrusionCut::FeaturesAPI_ExtrusionCut(
   const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -198,6 +214,22 @@ FeaturesAPI_ExtrusionCut::FeaturesAPI_ExtrusionCut(
   }
 }
 
+//==================================================================================================
+FeaturesAPI_ExtrusionCut::FeaturesAPI_ExtrusionCut(
+  const std::shared_ptr<ModelAPI_Feature>& theFeature,
+  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+  const ModelHighAPI_Selection& theDirection,
+  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+: FeaturesAPI_ExtrusionBoolean(theFeature)
+{
+  if(initialize()) {
+    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(theDirection, mydirection);
+    fillAttribute(FeaturesPlugin_Extrusion::CREATION_METHOD_THROUGH_ALL(), mycreationMethod);
+    setBooleanObjects(theBooleanObjects);
+  }
+}
+
 //==================================================================================================
 FeaturesAPI_ExtrusionCut::FeaturesAPI_ExtrusionCut(
   const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -287,6 +319,17 @@ FeaturesAPI_ExtrusionCut::FeaturesAPI_ExtrusionCut(
   }
 }
 
+//==================================================================================================
+ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature =
+    thePart->addFeature(FeaturesPlugin_ExtrusionCut::ID());
+  return ExtrusionCutPtr(new FeaturesAPI_ExtrusionCut(aFeature, theBaseObjects,
+                                                      theBooleanObjects));
+}
+
 //==================================================================================================
 ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
                                 const std::list<ModelHighAPI_Selection>& theBaseObjects,
@@ -299,6 +342,18 @@ ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePar
                                                       theSize, theBooleanObjects));
 }
 
+//==================================================================================================
+ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                const ModelHighAPI_Selection& theDirection,
+                                const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature =
+    thePart->addFeature(FeaturesPlugin_ExtrusionCut::ID());
+  return ExtrusionCutPtr(new FeaturesAPI_ExtrusionCut(aFeature, theBaseObjects, theDirection,
+                                                      theBooleanObjects));
+}
+
 //==================================================================================================
 ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
                                 const std::list<ModelHighAPI_Selection>& theBaseObjects,
@@ -394,6 +449,20 @@ FeaturesAPI_ExtrusionFuse::FeaturesAPI_ExtrusionFuse(
   initialize();
 }
 
+//==================================================================================================
+FeaturesAPI_ExtrusionFuse::FeaturesAPI_ExtrusionFuse(
+  const std::shared_ptr<ModelAPI_Feature>& theFeature,
+  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+: FeaturesAPI_ExtrusionBoolean(theFeature)
+{
+  if(initialize()) {
+    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(FeaturesPlugin_Extrusion::CREATION_METHOD_THROUGH_ALL(), mycreationMethod);
+    setBooleanObjects(theBooleanObjects);
+  }
+}
+
 //==================================================================================================
 FeaturesAPI_ExtrusionFuse::FeaturesAPI_ExtrusionFuse(
   const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -409,6 +478,22 @@ FeaturesAPI_ExtrusionFuse::FeaturesAPI_ExtrusionFuse(
   }
 }
 
+//==================================================================================================
+FeaturesAPI_ExtrusionFuse::FeaturesAPI_ExtrusionFuse(
+  const std::shared_ptr<ModelAPI_Feature>& theFeature,
+  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+  const ModelHighAPI_Selection& theDirection,
+  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+: FeaturesAPI_ExtrusionBoolean(theFeature)
+{
+  if(initialize()) {
+    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(theDirection, mydirection);
+    fillAttribute(FeaturesPlugin_Extrusion::CREATION_METHOD_THROUGH_ALL(), mycreationMethod);
+    setBooleanObjects(theBooleanObjects);
+  }
+}
+
 //==================================================================================================
 FeaturesAPI_ExtrusionFuse::FeaturesAPI_ExtrusionFuse(
   const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -498,6 +583,17 @@ FeaturesAPI_ExtrusionFuse::FeaturesAPI_ExtrusionFuse(
   }
 }
 
+//==================================================================================================
+ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature =
+    thePart->addFeature(FeaturesPlugin_ExtrusionFuse::ID());
+  return ExtrusionFusePtr(new FeaturesAPI_ExtrusionFuse(aFeature, theBaseObjects,
+                                                        theBooleanObjects));
+}
+
 //==================================================================================================
 ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
                                   const std::list<ModelHighAPI_Selection>& theBaseObjects,
@@ -510,6 +606,18 @@ ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& theP
                                                         theSize, theBooleanObjects));
 }
 
+//==================================================================================================
+ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                  const ModelHighAPI_Selection& theDirection,
+                                  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature =
+    thePart->addFeature(FeaturesPlugin_ExtrusionFuse::ID());
+  return ExtrusionFusePtr(new FeaturesAPI_ExtrusionFuse(aFeature, theBaseObjects,
+                                                        theDirection, theBooleanObjects));
+}
+
 //==================================================================================================
 ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
                                   const std::list<ModelHighAPI_Selection>& theBaseObjects,
index 42a4791195bcdabcdc8e9b4776fe5b2598e1ab68..c5777d3192130c161619a5ca0a1fbdfcedf1d507 100644 (file)
@@ -130,6 +130,12 @@ public:
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_ExtrusionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature);
 
+  /// Constructor with values.
+  FEATURESAPI_EXPORT
+  explicit FeaturesAPI_ExtrusionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                                    const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                    const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_ExtrusionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -137,6 +143,13 @@ public:
                                     const ModelHighAPI_Double& theSize,
                                     const std::list<ModelHighAPI_Selection>& theBooleanObjects);
 
+  /// Constructor with values.
+  FEATURESAPI_EXPORT
+  explicit FeaturesAPI_ExtrusionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                                    const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                    const ModelHighAPI_Selection& theDirection,
+                                    const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_ExtrusionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -187,6 +200,13 @@ public:
 /// Pointer on ExtrusionCut object.
 typedef std::shared_ptr<FeaturesAPI_ExtrusionCut> ExtrusionCutPtr;
 
+/// \ingroup CPPHighAPI
+/// \brief Create ExtrusionCut feature.
+FEATURESAPI_EXPORT
+ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
 /// \ingroup CPPHighAPI
 /// \brief Create ExtrusionCut feature.
 FEATURESAPI_EXPORT
@@ -195,6 +215,14 @@ ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePar
                                 const ModelHighAPI_Double& theSize,
                                 const std::list<ModelHighAPI_Selection>& theBooleanObjects);
 
+/// \ingroup CPPHighAPI
+/// \brief Create ExtrusionCut feature.
+FEATURESAPI_EXPORT
+ExtrusionCutPtr addExtrusionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                const ModelHighAPI_Selection& theDirection,
+                                const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
 /// \ingroup CPPHighAPI
 /// \brief Create ExtrusionCut feature.
 FEATURESAPI_EXPORT
@@ -259,6 +287,12 @@ public:
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_ExtrusionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature);
 
+  /// Constructor with values.
+  FEATURESAPI_EXPORT
+  explicit FeaturesAPI_ExtrusionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                                     const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                     const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_ExtrusionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -266,6 +300,13 @@ public:
                                      const ModelHighAPI_Double& theSize,
                                      const std::list<ModelHighAPI_Selection>& theBooleanObjects);
 
+  /// Constructor with values.
+  FEATURESAPI_EXPORT
+  explicit FeaturesAPI_ExtrusionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                                     const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                     const ModelHighAPI_Selection& theDirection,
+                                     const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_ExtrusionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -316,6 +357,13 @@ public:
 /// Pointer on ExtrusionFuse object.
 typedef std::shared_ptr<FeaturesAPI_ExtrusionFuse> ExtrusionFusePtr;
 
+/// \ingroup CPPHighAPI
+/// \brief Create ExtrusionFuse feature.
+FEATURESAPI_EXPORT
+ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                  const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
 /// \ingroup CPPHighAPI
 /// \brief Create ExtrusionFuse feature.
 FEATURESAPI_EXPORT
@@ -324,6 +372,14 @@ ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& theP
                                   const ModelHighAPI_Double& theSize,
                                   const std::list<ModelHighAPI_Selection>& theBooleanObjects);
 
+/// \ingroup CPPHighAPI
+/// \brief Create ExtrusionFuse feature.
+FEATURESAPI_EXPORT
+ExtrusionFusePtr addExtrusionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                  const ModelHighAPI_Selection& theDirection,
+                                  const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
 /// \ingroup CPPHighAPI
 /// \brief Create ExtrusionFuse feature.
 FEATURESAPI_EXPORT
index 385244275779ff6a8c4b0d2adf9dcc13dac69b18..3f595c2e933fffad62bf84828cee4dfcd6433aab 100644 (file)
@@ -94,7 +94,7 @@ void FeaturesAPI_RevolutionBoolean::setAngle(const ModelHighAPI_Double& theAngle
 //==================================================================================================
 void FeaturesAPI_RevolutionBoolean::setPlanesAndOffsets(const ModelHighAPI_Selection& theToObject,
                                                         const ModelHighAPI_Double& theToOffset,
-                                                      const ModelHighAPI_Selection& theFromObject,
+                                                        const ModelHighAPI_Selection& theFromObject,
                                                         const ModelHighAPI_Double& theFromOffset)
 {
   fillAttribute(FeaturesPlugin_Revolution::CREATION_METHOD_BY_PLANES(), mycreationMethod);
@@ -158,6 +158,8 @@ void FeaturesAPI_RevolutionBoolean::dump(ModelHighAPI_Dumper& theDumper) const
 
     theDumper << ", " << anAttrToObject << ", " << anAttrToOffset <<
       ", " << anAttrFromObject << ", " << anAttrFromOffset;
+  } else {
+    // Through All
   }
 
   AttributeSelectionListPtr anAttrBoolObjects =
@@ -185,6 +187,22 @@ FeaturesAPI_RevolutionCut::FeaturesAPI_RevolutionCut(
   initialize();
 }
 
+//==================================================================================================
+FeaturesAPI_RevolutionCut::FeaturesAPI_RevolutionCut(
+  const std::shared_ptr<ModelAPI_Feature>& theFeature,
+  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+  const ModelHighAPI_Selection& theAxis,
+  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+: FeaturesAPI_RevolutionBoolean(theFeature)
+{
+  if(initialize()) {
+    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(theAxis, myaxis);
+    fillAttribute(FeaturesPlugin_Revolution::CREATION_METHOD_THROUGH_ALL(), mycreationMethod);
+    setBooleanObjects(theBooleanObjects);
+  }
+}
+
 //==================================================================================================
 FeaturesAPI_RevolutionCut::FeaturesAPI_RevolutionCut(
   const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -246,6 +264,18 @@ FeaturesAPI_RevolutionCut::FeaturesAPI_RevolutionCut(
   }
 }
 
+//==================================================================================================
+RevolutionCutPtr addRevolutionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                  const ModelHighAPI_Selection& theAxis,
+                                  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature =
+    thePart->addFeature(FeaturesPlugin_RevolutionCut::ID());
+  return RevolutionCutPtr(new FeaturesAPI_RevolutionCut(aFeature, theBaseObjects,
+                                                        theAxis, theBooleanObjects));
+}
+
 //==================================================================================================
 RevolutionCutPtr addRevolutionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
                                   const std::list<ModelHighAPI_Selection>& theBaseObjects,
@@ -308,6 +338,22 @@ FeaturesAPI_RevolutionFuse::FeaturesAPI_RevolutionFuse(
   initialize();
 }
 
+//==================================================================================================
+FeaturesAPI_RevolutionFuse::FeaturesAPI_RevolutionFuse(
+  const std::shared_ptr<ModelAPI_Feature>& theFeature,
+  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+  const ModelHighAPI_Selection& theAxis,
+  const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+: FeaturesAPI_RevolutionBoolean(theFeature)
+{
+  if(initialize()) {
+    fillAttribute(theBaseObjects, mybaseObjects);
+    fillAttribute(theAxis, myaxis);
+    fillAttribute(FeaturesPlugin_Revolution::CREATION_METHOD_THROUGH_ALL(), mycreationMethod);
+    setBooleanObjects(theBooleanObjects);
+  }
+}
+
 //==================================================================================================
 FeaturesAPI_RevolutionFuse::FeaturesAPI_RevolutionFuse(
   const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -371,6 +417,18 @@ FeaturesAPI_RevolutionFuse::FeaturesAPI_RevolutionFuse(
   }
 }
 
+//==================================================================================================
+RevolutionFusePtr addRevolutionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                    const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                    const ModelHighAPI_Selection& theAxis,
+                                    const std::list<ModelHighAPI_Selection>& theBooleanObjects)
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature =
+    thePart->addFeature(FeaturesPlugin_RevolutionFuse::ID());
+  return RevolutionFusePtr(new FeaturesAPI_RevolutionFuse(aFeature, theBaseObjects,
+                                                          theAxis, theBooleanObjects));
+}
+
 //==================================================================================================
 RevolutionFusePtr addRevolutionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
                                     const std::list<ModelHighAPI_Selection>& theBaseObjects,
index cd7809176800c9941d44decdb3551cd953d0a469..5f636c0811c9ef21289a006d077d2b819e19d935 100644 (file)
@@ -127,6 +127,13 @@ public:
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_RevolutionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature);
 
+  /// Constructor with values.
+  FEATURESAPI_EXPORT
+  explicit FeaturesAPI_RevolutionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                                     const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                     const ModelHighAPI_Selection& theAxis,
+                                     const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_RevolutionCut(const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -159,6 +166,14 @@ public:
 /// Pointer on RevolutionCut object.
 typedef std::shared_ptr<FeaturesAPI_RevolutionCut> RevolutionCutPtr;
 
+/// \ingroup CPPHighAPI
+/// \brief Create RevolutionCut feature.
+FEATURESAPI_EXPORT
+RevolutionCutPtr addRevolutionCut(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                  const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                  const ModelHighAPI_Selection& theAxis,
+                                  const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
 /// \ingroup CPPHighAPI
 /// \brief Create RevolutionCut feature.
 FEATURESAPI_EXPORT
@@ -204,6 +219,13 @@ public:
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_RevolutionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature);
 
+  /// Constructor with values.
+  FEATURESAPI_EXPORT
+  explicit FeaturesAPI_RevolutionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
+                                      const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                      const ModelHighAPI_Selection& theAxis,
+                                      const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
   /// Constructor with values.
   FEATURESAPI_EXPORT
   explicit FeaturesAPI_RevolutionFuse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
@@ -236,6 +258,14 @@ public:
 /// Pointer on RevolutionFuse object.
 typedef std::shared_ptr<FeaturesAPI_RevolutionFuse> RevolutionFusePtr;
 
+/// \ingroup CPPHighAPI
+/// \brief Create RevolutionFuse feature.
+FEATURESAPI_EXPORT
+RevolutionFusePtr addRevolutionFuse(const std::shared_ptr<ModelAPI_Document>& thePart,
+                                    const std::list<ModelHighAPI_Selection>& theBaseObjects,
+                                    const ModelHighAPI_Selection& theAxis,
+                                    const std::list<ModelHighAPI_Selection>& theBooleanObjects);
+
 /// \ingroup CPPHighAPI
 /// \brief Create RevolutionFuse feature.
 FEATURESAPI_EXPORT
index d2e81e3c48168db8513ddde581364ced19c30a32..ea14d9ea6191b21c6dcb092626702e2aecae0a7a 100644 (file)
@@ -139,6 +139,7 @@ SET(XML_RESOURCES
 
 SET(TEXT_RESOURCES
     FeaturesPlugin_msg_en.ts
+    FeaturesPlugin_msg_fr.ts
     FeaturesPlugin_msg_ru.ts
 )
 
@@ -180,9 +181,11 @@ ADD_UNIT_TESTS(TestExtrusion.py
                TestExtrusionCut_BySize.py
                TestExtrusionCut_ByPlanesAndOffsets.py
                TestExtrusionCut_ByFaces.py
+               TestExtrusionCut_ThroughAll.py
                TestExtrusionFuse.py
                TestExtrusionFuse_BySize.py
                TestExtrusionFuse_ByPlanesAndOffsets.py
+               TestExtrusionFuse_ThroughAll.py
                TestExtrusion_ErrorMsg.py
                TestExtrusion_ZeroOffsetError.py
                TestExtrusion_ByFaces01.py
@@ -212,9 +215,11 @@ ADD_UNIT_TESTS(TestExtrusion.py
                TestRevolutionCut.py
                TestRevolutionCut_ByAngle.py
                TestRevolutionCut_ByPlanesAndOffsets.py
+               TestRevolutionCut_ThroughAll.py
                TestRevolutionFuse.py
                TestRevolutionFuse_ByAngle.py
                TestRevolutionFuse_ByPlanesAndOffsets.py
+               TestRevolutionFuse_ThroughAll.py
                TestCompositeFeaturesOnCompSolids.py
                TestPartition.py
                TestPartition_ErrorMsg.py
index bfcbde007c375efe9356930b07a5597be1e84e97..57b1ba874b20897df91b6a0d5875b18093f244c9 100644 (file)
@@ -101,53 +101,20 @@ bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes,
   getBaseShapes(theBaseShapes);
 
   //Getting direction.
-  static const std::string aSelectionError = "Error: The direction shape selection is bad.";
-  AttributeSelectionPtr aSelection = selection(DIRECTION_OBJECT_ID());
-  GeomShapePtr aShape = aSelection->value();
-  if (!aShape.get()) {
-    if (aSelection->context().get()) {
-      aShape = aSelection->context()->shape();
-    }
-  }
-
-  GeomEdgePtr anEdge;
-  if (aShape.get()) {
-    if (aShape->isEdge())
-    {
-      anEdge = aShape->edge();
-    }
-    else if (aShape->isCompound())
-    {
-      GeomAPI_ShapeIterator anIt(aShape);
-      anEdge = anIt.current()->edge();
-    }
-  }
-
   std::shared_ptr<GeomAPI_Dir> aDir;
-  if(anEdge.get()) {
-    if(anEdge->isLine()) {
-      aDir = anEdge->line()->direction();
-    }
-  }
+  getDirection(aDir);
 
   // Getting sizes.
   double aToSize = 0.0;
   double aFromSize = 0.0;
-
-  if(string(CREATION_METHOD())->value() == CREATION_METHOD_BY_SIZES()) {
-    aToSize = real(TO_SIZE_ID())->value();
-    aFromSize = real(FROM_SIZE_ID())->value();
-  } else {
-    aToSize = real(TO_OFFSET_ID())->value();
-    aFromSize = real(FROM_OFFSET_ID())->value();
-  }
+  getSizes(aToSize, aFromSize);
 
   // Getting bounding planes.
   GeomShapePtr aToShape;
   GeomShapePtr aFromShape;
 
   if(string(CREATION_METHOD())->value() == CREATION_METHOD_BY_PLANES()) {
-    aSelection = selection(TO_OBJECT_ID());
+    AttributeSelectionPtr aSelection = selection(TO_OBJECT_ID());
     if(aSelection.get()) {
       aToShape = std::dynamic_pointer_cast<GeomAPI_Shape>(aSelection->value());
       if(!aToShape.get() && aSelection->context().get()) {
@@ -214,3 +181,48 @@ void FeaturesPlugin_Extrusion::storeResultWithBoundaries(
 
   setResult(aResultBody, theIndex);
 }
+
+//=================================================================================================
+void FeaturesPlugin_Extrusion::getDirection(std::shared_ptr<GeomAPI_Dir>& theDir)
+{
+  static const std::string aSelectionError = "Error: The direction shape selection is bad.";
+  AttributeSelectionPtr aSelection = selection(DIRECTION_OBJECT_ID());
+  GeomShapePtr aShape = aSelection->value();
+  if (!aShape.get()) {
+    if (aSelection->context().get()) {
+      aShape = aSelection->context()->shape();
+    }
+  }
+
+  GeomEdgePtr anEdge;
+  if (aShape.get()) {
+    if (aShape->isEdge())
+    {
+      anEdge = aShape->edge();
+    }
+    else if (aShape->isCompound())
+    {
+      GeomAPI_ShapeIterator anIt(aShape);
+      anEdge = anIt.current()->edge();
+    }
+  }
+
+  if (anEdge.get()) {
+    if (anEdge->isLine()) {
+      theDir = anEdge->line()->direction();
+    }
+  }
+}
+
+//=================================================================================================
+void FeaturesPlugin_Extrusion::getSizes(double& theToSize, double& theFromSize)
+{
+  if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_SIZES()) {
+    theToSize = real(TO_SIZE_ID())->value();
+    theFromSize = real(FROM_SIZE_ID())->value();
+  } if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_PLANES()) {
+    theToSize = real(TO_OFFSET_ID())->value();
+    theFromSize = real(FROM_OFFSET_ID())->value();
+  } else {
+  }
+}
index d0a6e374530dcb3d161aa2397426660cb74691a1..7a80cc5875570c0f754bb9d10601ca8d0646e7c0 100644 (file)
@@ -67,6 +67,13 @@ public:
     return MY_CREATION_METHOD_ID;
   }
 
+  /// Attribute name for creation method.
+  inline static const std::string& CREATION_METHOD_THROUGH_ALL()
+  {
+    static const std::string MY_CREATION_METHOD_ID("ThroughAll");
+    return MY_CREATION_METHOD_ID;
+  }
+
   /// Attribute name of an object to which the extrusion grows.
   inline static const std::string& DIRECTION_OBJECT_ID()
   {
@@ -144,6 +151,12 @@ protected:
                                  const ListOfShape& theBoundaryShapes,
                                  const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape,
                                  const int theIndex = 0);
+
+  /// Retrieve direction argument.
+  void getDirection(std::shared_ptr<GeomAPI_Dir>& theDir);
+
+  /// Retrieve or calculate prism sizes.
+  virtual void getSizes(double& theToSize, double& theFromSize);
 };
 
 #endif
index edbdcf948aaeefa4c9a8c490237543c7a5eee256..7075175e3e40d71205c2945eb2bb9fd8497ea9dc 100644 (file)
 
 #include "FeaturesPlugin_ExtrusionBoolean.h"
 
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeString.h>
+
+#include <GeomAlgoAPI_ShapeTools.h>
+
 //=================================================================================================
 void FeaturesPlugin_ExtrusionBoolean::initAttributes()
 {
@@ -42,3 +47,35 @@ void FeaturesPlugin_ExtrusionBoolean::storeGenerationHistory(ResultBodyPtr theRe
 {
   FeaturesPlugin_Extrusion::storeGenerationHistory(theResultBody, theBaseShape, theMakeShape);
 }
+
+//=================================================================================================
+void FeaturesPlugin_ExtrusionBoolean::getSizes(double& theToSize, double& theFromSize)
+{
+  if (string(CREATION_METHOD())->value() != CREATION_METHOD_THROUGH_ALL()) {
+    FeaturesPlugin_Extrusion::getSizes(theToSize, theFromSize);
+  } else {
+    // Getting objects.
+    ListOfShape anObjects;
+    AttributeSelectionListPtr anObjectsSelList = myFeature->selectionList(OBJECTS_ID());
+    for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) {
+      AttributeSelectionPtr anObjectAttr = anObjectsSelList->value(anObjectsIndex);
+      GeomShapePtr anObject = anObjectAttr->value();
+      if (!anObject.get()) {
+        myFeature->setError("Error: Could not get object.");
+        return;
+      }
+      anObjects.push_back(anObject);
+    }
+
+    // Getting prism bases.
+    ListOfShape aBaseShapes;
+    getBaseShapes(aBaseShapes);
+
+    // Getting prism direction.
+    std::shared_ptr<GeomAPI_Dir> aDir;
+    getDirection(aDir);
+
+    // Calculate sizes
+    GeomAlgoAPI_ShapeTools::computeThroughAll(anObjects, aBaseShapes, aDir, theToSize, theFromSize);
+  }
+}
index ee575471bf4ff6f92d3260e208671fa9e9938a82..ee624029b74738f9411e38db98ca51b9efadf092 100644 (file)
@@ -44,6 +44,10 @@ protected:
   void storeGenerationHistory(ResultBodyPtr theResultBody,
                               const GeomShapePtr theBaseShape,
                               const std::shared_ptr<GeomAlgoAPI_MakeShape> theMakeShape);
+
+  /// Calculate prism sizes to ensure that it passes through all objects
+  /// Redefined from FeaturesPlugin_Extrusion
+  virtual void getSizes(double& theToSize, double& theFromSize);
 };
 
 #endif
index 52461e30388f73559141f7991b4d2e94fd942d26..a50ec376897ae6168498a0e36213ab781d8ae743 100644 (file)
 
 #include "FeaturesPlugin_ExtrusionFuse.h"
 
+#include <ModelAPI_AttributeString.h>
+#include <ModelAPI_AttributeSelectionList.h>
+
+#include <GeomAlgoAPI_Boolean.h>
+#include <GeomAlgoAPI_Prism.h>
+#include <GeomAlgoAPI_ThroughAll.h>
+#include <GeomAlgoAPI_CompoundBuilder.h>
+
 //=================================================================================================
 FeaturesPlugin_ExtrusionFuse::FeaturesPlugin_ExtrusionFuse()
 {
@@ -29,5 +37,127 @@ FeaturesPlugin_ExtrusionFuse::FeaturesPlugin_ExtrusionFuse()
 //=================================================================================================
 void FeaturesPlugin_ExtrusionFuse::execute()
 {
-  executeCompositeBoolean();
+  if (string(CREATION_METHOD())->value() != CREATION_METHOD_THROUGH_ALL())
+    executeCompositeBoolean();
+  else {
+    executeFuseThroughAll();
+  }
+}
+
+//=================================================================================================
+void FeaturesPlugin_ExtrusionFuse::executeFuseThroughAll()
+{
+  // Getting objects.
+  ListOfShape anObjects;
+  AttributeSelectionListPtr anObjectsSelList = myFeature->selectionList(OBJECTS_ID());
+  for (int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) {
+    AttributeSelectionPtr anObjectAttr = anObjectsSelList->value(anObjectsIndex);
+    GeomShapePtr anObject = anObjectAttr->value();
+    if (!anObject.get()) {
+      myFeature->setError("Error: Could not get object.");
+      return;
+    }
+    anObjects.push_back(anObject);
+  }
+
+  // Make generation.
+  ListOfShape aGenBaseShapes;
+  ListOfMakeShape aGenMakeShapes;
+  if (!makeGeneration(aGenBaseShapes, aGenMakeShapes)) {
+    return;
+  }
+
+  // Getting tools.
+  ListOfShape aNewTools;
+  ListOfMakeShape aToolsMakeShapes;
+  for (ListOfMakeShape::const_iterator
+         anIt = aGenMakeShapes.cbegin(); anIt != aGenMakeShapes.cend(); ++anIt) {
+    GeomMakeShapePtr anAlgo = (*anIt);
+    std::shared_ptr<GeomAlgoAPI_Prism> aPrismAlgo = std::dynamic_pointer_cast<GeomAlgoAPI_Prism>(anAlgo);
+
+    // Cut the prism by all objects and throw away end pieces
+    std::shared_ptr<GeomAlgoAPI_ThroughAll> aToolAlgo (new GeomAlgoAPI_ThroughAll(aPrismAlgo, anObjects));
+
+    // Checking that the algorithm worked properly
+    if (!aToolAlgo->isDone() || aToolAlgo->shape()->isNull() || !aToolAlgo->isValid()) {
+      myFeature->setError("Error: ThroughAll algorithm failed.");
+    } else {
+      GeomShapePtr aCuttedTool = aToolAlgo->shape();
+      aNewTools.push_back(aCuttedTool);
+      aToolsMakeShapes.push_back(aToolAlgo);
+    }
+  }
+
+  // Perform FeaturesPlugin_CompositeBoolean::makeBoolean() with new (cutted) tools
+  ListOfShape aBooleanObjects;
+  ListOfMakeShape aBooleanMakeShapes;
+  if (!makeBoolean(aNewTools, aBooleanObjects, aBooleanMakeShapes)) {
+    return;
+  }
+
+  if (myOperationType == BOOL_FUSE) {
+    aNewTools.splice(aNewTools.begin(), aBooleanObjects);
+    aBooleanObjects.splice(aBooleanObjects.begin(), aNewTools, aNewTools.begin());
+  }
+
+  // 4. Store result (like in FeaturesPlugin_CompositeBoolean::executeCompositeBoolean())
+  int aResultIndex = 0;
+  std::vector<ResultBaseAlgo> aResultBaseAlgoList;
+  ListOfShape aResultShapesList;
+  ListOfShape::const_iterator aBoolObjIt = aBooleanObjects.cbegin();
+  ListOfMakeShape::const_iterator aBoolMSIt = aBooleanMakeShapes.cbegin();
+  for(; aBoolObjIt != aBooleanObjects.cend() && aBoolMSIt != aBooleanMakeShapes.cend();
+      ++aBoolObjIt, ++aBoolMSIt) {
+
+    ResultBodyPtr aResultBody = myFeature->document()->createBody(myFeature->data(), aResultIndex);
+
+    if((*aBoolObjIt)->isEqual((*aBoolMSIt)->shape())) {
+      aResultBody->store((*aBoolMSIt)->shape(), false);
+    }
+    else
+    {
+      aResultBody->storeModified(*aBoolObjIt, (*aBoolMSIt)->shape());
+
+      // Store generation history.
+      ListOfShape::const_iterator aGenBaseIt = aGenBaseShapes.cbegin();
+      ListOfMakeShape::const_iterator aGenMSIt = aGenMakeShapes.cbegin();
+      for(; aGenBaseIt != aGenBaseShapes.cend() && aGenMSIt != aGenMakeShapes.cend();
+          ++aGenBaseIt, ++aGenMSIt) {
+
+        // ???
+        ListOfMakeShape::const_iterator aToolsMSIt = aToolsMakeShapes.cbegin();
+        for(; aToolsMSIt != aToolsMakeShapes.cend(); ++aToolsMSIt) {
+          std::shared_ptr<GeomAlgoAPI_MakeShapeList> aMSList(new GeomAlgoAPI_MakeShapeList());
+
+          // prism generation
+          aMSList->appendAlgo(*aGenMSIt);
+
+          // tool modification (cut by objects)
+          aMSList->appendAlgo(*aToolsMSIt);
+
+          // bool fuse
+          aMSList->appendAlgo(*aBoolMSIt);
+          storeGenerationHistory(aResultBody, *aGenBaseIt, aMSList);
+        }
+      }
+
+      storeModificationHistory(aResultBody, *aBoolObjIt, aNewTools, *aBoolMSIt);
+
+      ResultBaseAlgo aRBA;
+      aRBA.resultBody = aResultBody;
+      aRBA.baseShape = *aBoolObjIt;
+      aRBA.makeShape = *aBoolMSIt;
+      aResultBaseAlgoList.push_back(aRBA);
+      aResultShapesList.push_back((*aBoolMSIt)->shape());
+    }
+
+    myFeature->setResult(aResultBody, aResultIndex++);
+  }
+
+  // Store deleted shapes after all results has been proceeded. This is to avoid issue when in one
+  // result shape has been deleted, but in another it was modified or stayed.
+  GeomShapePtr aResultShapesCompound = GeomAlgoAPI_CompoundBuilder::compound(aResultShapesList);
+  storeDeletedShapes(aResultBaseAlgoList, aNewTools, aResultShapesCompound);
+
+  myFeature->removeResults(aResultIndex);
 }
index 55f5a671ee1a1f2fe3705f285a127cb991d6d308..a2daea88a44c51a251be0dc499987d4d58b7ded3 100644 (file)
@@ -28,7 +28,7 @@
 ///        fuse result with other objects in a single operation.
 class FeaturesPlugin_ExtrusionFuse : public FeaturesPlugin_ExtrusionBoolean
 {
-public:
+ public:
   /// Use plugin manager for features creation.
   FeaturesPlugin_ExtrusionFuse();
 
@@ -48,6 +48,9 @@ public:
 
   /// Creates a new part document if needed.
   FEATURESPLUGIN_EXPORT virtual void execute();
+
+ private:
+  void executeFuseThroughAll();
 };
 
 #endif
index 9994cd900268067bdf4f7ed728600b7306da9945..1789039f5595192f14ed0b5caa5eb04e62553fcd 100644 (file)
@@ -139,12 +139,16 @@ bool FeaturesPlugin_Revolution::makeRevolutions(ListOfShape& theBaseShapes,
   double aToAngle = 0.0;
   double aFromAngle = 0.0;
 
-  if(string(CREATION_METHOD())->value() == CREATION_METHOD_BY_ANGLES()) {
+  if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_ANGLES()) {
     aToAngle = real(TO_ANGLE_ID())->value();
     aFromAngle = real(FROM_ANGLE_ID())->value();
-  } else {
+  } else if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_PLANES()) {
     aToAngle = real(TO_OFFSET_ID())->value();
     aFromAngle = real(FROM_OFFSET_ID())->value();
+  } else if (string(CREATION_METHOD())->value() == CREATION_METHOD_THROUGH_ALL()) {
+    aToAngle = 360.0;
+    aFromAngle = 0.0;
+  } else {
   }
 
   // Getting bounding planes.
index cd0b929fc777eefe1984a6e9a68b6703c5ec6367..820ae3471fcf9acfb924ff983202a4f73038a113 100644 (file)
@@ -48,6 +48,13 @@ public:
     return MY_CREATION_METHOD_ID;
   }
 
+  /// Attribute name for creation method.
+  inline static const std::string& CREATION_METHOD_THROUGH_ALL()
+  {
+    static const std::string MY_CREATION_METHOD_ID("ThroughAll");
+    return MY_CREATION_METHOD_ID;
+  }
+
   /// Attribute name for creation method.
   inline static const std::string& CREATION_METHOD_BY_ANGLES()
   {
diff --git a/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts b/src/FeaturesPlugin/FeaturesPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..95b2e83
--- /dev/null
@@ -0,0 +1,5822 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <!-- workshop -->
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Features</source>
+      <translation>Caractéristiques</translation>
+    </message>
+    <message>
+      <source>Common</source>
+      <translation>Intersection</translation>
+    </message>
+    <message>
+      <source>Cut</source>
+      <translation>Découpe</translation>
+    </message>
+    <message>
+      <source>Extrusion</source>
+      <translation>Extrusion</translation>
+    </message>
+    <message>
+      <source>ExtrusionCut</source>
+      <translation>Enlèvement de matière extrudé</translation>
+    </message>
+    <message>
+      <source>ExtrusionFuse</source>
+      <translation>Bossage extrudé</translation>
+    </message>
+    <message>
+      <source>Fillet</source>
+      <translation>Congé</translation>
+    </message>
+    <message>
+      <source>Fuse</source>
+      <translation>Fusionner</translation>
+    </message>
+    <message>
+      <source>Fuse Faces</source>
+      <translation>Fusionner des faces</translation>
+    </message>
+    <message>
+      <source>Intersection</source>
+      <translation>Section</translation>
+    </message>
+    <message>
+      <source>Partition</source>
+      <translation>Partition</translation>
+    </message>
+    <message>
+      <source>Pipe</source>
+      <translation>Tuyau</translation>
+    </message>
+    <message>
+      <source>Recover</source>
+      <translation>Récupérer</translation>
+    </message>
+    <message>
+      <source>Remove Sub-Shapes</source>
+      <translation>Supprimer les sous-formes</translation>
+    </message>
+    <message>
+      <source>Revolution</source>
+      <translation>Révolution</translation>
+    </message>
+    <message>
+      <source>RevolutionCut</source>
+      <translation>Enlèvement de matière avec révolution</translation>
+    </message>
+    <message>
+      <source>RevolutionFuse</source>
+      <translation>Bossage avec révolution</translation>
+    </message>
+    <message>
+      <source>Scale</source>
+      <translation>Échelle</translation>
+    </message>
+    <message>
+      <source>Smash</source>
+      <translation>Smash</translation>
+    </message>
+    <message>
+      <source>Split</source>
+      <translation>Diviser</translation>
+    </message>
+    <message>
+      <source>Union</source>
+      <translation>Réunion</translation>
+    </message>
+    <!-- Part menu -->
+    <message>
+      <source>Angular Copy</source>
+      <translation>Copie angulaire</translation>
+    </message>
+    <message>
+      <source>Linear copy</source>
+      <translation>Copie linéaire</translation>
+    </message>
+    <message>
+      <source>Measurement</source>
+      <translation>Mesure</translation>
+    </message>
+    <message>
+      <source>Placement</source>
+      <translation>Placement</translation>
+    </message>
+    <message>
+      <source>Rotation</source>
+      <translation>Rotation</translation>
+    </message>
+    <message>
+      <source>Symmetry</source>
+      <translation>Symétrie</translation>
+    </message>
+    <message>
+      <source>Translation</source>
+      <translation>Translation</translation>
+    </message>
+  </context>
+
+  <!-- Common -->
+  <context>
+    <name>Common</name>
+    <message>
+      <source>Common</source>
+      <translation>Intersection</translation>
+    </message>
+    <message>
+      <source>Perform boolean common operation with objects</source>
+      <translation>Effectuer l’opération booléenne section avec des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Common:FeaturesPlugin_ValidatorBooleanCommonArguments</name>
+    <message>
+      <source>Not enough arguments for Fuse operation.</source>
+      <translation>Pas assez d&apos;arguments pour l&apos;opération Fusionner.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Common:creation_method</name>
+    <message>
+      <source>Simple</source>
+      <translation>Simple</translation>
+    </message>
+    <message>
+      <source>advanced</source>
+      <translation>avancée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Common:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Objects</source>
+      <translation>Objets</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Common:tool_objects</name>
+    <message>
+      <source>Select tools</source>
+      <translation>Sélectionnez des outils</translation>
+    </message>
+    <context>
+      <name>Common:tool_objects</name>
+      <message>
+        <source>Attribute "%1" is not initialized.</source>
+        <translation>Sélectionnez des outils.</translation>
+      </message>
+    </context>
+    <message>
+      <source>Tool objects</source>
+      <translation>Objets outils</translation>
+    </message>
+  </context>
+  <context>
+    <name>Model_Data</name>
+    <message>
+      <source>%1 has failed during the update</source>
+      <translation>%1 a échoué lors de la mise à jour</translation>
+    </message>
+  </context>
+
+  <!-- Cut -->
+  <context>
+    <name>Cut</name>
+    <message>
+      <source>Cut</source>
+      <translation>Découpe</translation>
+    </message>
+    <message>
+      <source>Perform boolean cut operation with objects</source>
+      <translation>Effectuer l’opération booléenne découpe avec des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cut:FeaturesPlugin_ValidatorBooleanArguments</name>
+    <message>
+      <source>Objects not selected.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cut:FeaturesPlugin_ValidatorBooleanArguments</name>
+    <message>
+      <source>Tools not selected.</source>
+      <translation>Les objets outils ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cut:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cut:tool_objects</name>
+    <message>
+      <source>Select tools</source>
+      <translation>Sélectionnez des outils</translation>
+    </message>
+    <message>
+      <source>Tool objects</source>
+      <translation>Objets outils</translation>
+    </message>
+  </context>
+
+  <!-- Extrusion -->
+  <context>
+    <name>Extrusion</name>
+    <message>
+      <source>Create a solid by extrusion of a face</source>
+      <translation>Créer un solide par extrusion d&apos;une face</translation>
+    </message>
+    <message>
+      <source>Extrusion</source>
+      <translation>Extrusion</translation>
+    </message>
+    <message>
+      <source>From</source>
+      <translation>De</translation>
+    </message>
+    <message>
+      <source>To</source>
+      <translation>À</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:CreationMethod</name>
+    <message>
+      <source>By bounding faces and offsets</source>
+      <translation>En délimitant les faces et les décalages</translation>
+    </message>
+    <message>
+      <source>By sizes</source>
+      <translation>Par tailles</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base</name>
+    <message>
+      <source>Base objects:</source>
+      <translation>Objets de base:</translation>
+    </message>
+    <message>
+      <source>Select a base objects</source>
+      <translation>Sélectionnez un objet de base</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un objet de base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object</name>
+    <message>
+      <source>Direction</source>
+      <translation>Direction</translation>
+    </message>
+    <message>
+      <source>Select an edge for direction</source>
+      <translation>Sélectionnez une arête pour la direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:from_object</name>
+    <message>
+      <source>From face</source>
+      <translation>À l’angle</translation>
+    </message>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:from_offset</name>
+    <message>
+      <source>Offset</source>
+      <translation>Décalage</translation>
+    </message>
+    <message>
+      <source>Offset for "from" bounding plane</source>
+      <translation>Décalage pour &quot;à partir&quot; du plan englobant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:from_size</name>
+    <message>
+      <source>From size</source>
+      <translation>À partir de la taille</translation>
+    </message>
+    <message>
+      <source>Size</source>
+      <translation>Taille</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:to_object</name>
+    <message>
+      <source>To face</source>
+      <translation>Jusqu’à la face</translation>
+    </message>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:to_offset</name>
+    <message>
+      <source>Offset</source>
+      <translation>Décalage</translation>
+    </message>
+    <message>
+      <source>Offset for "to" bounding plane</source>
+      <translation>Décalage pour &quot;au&quot; plan englobant</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:to_size</name>
+    <message>
+      <source>Size</source>
+      <translation>Taille</translation>
+    </message>
+    <message>
+      <source>To size</source>
+      <translation>À la taille</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object</name>
+    <message>
+      <source>&lt;base normal&gt;</source>
+      <translation>&lt;base normale&gt;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:sketch</name>
+    <message>
+      <source>Select:&lt;br /&gt; 1. Planar face of non-sketch object or a plane. Sketch creation will be started.&lt;br /&gt; 2. An existing sketch face or contour. Extrusion will be filled by it.&lt;br /&gt; 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+      <translation>Sélectionnez : &lt;br /&gt; 1. Face plane d&apos;un objet non esquissé ou d&apos;un plan. La création de l’esquisse sera lancée. &lt;br /&gt; 2. Une face ou un contour d’esquisse existant. L&apos;extrusion sera remplie par elle. &lt;br /&gt; 3. Une forme de résultat existante de type: contours / arête / sommets. L&apos;extrusion sera remplie par elle.</translation>
+    </message>
+  </context>
+
+  <!-- ExtrusionCut -->
+  <context>
+    <name>ExtrusionCut</name>
+    <message>
+      <source>ExtrusionCut</source>
+      <translation>Enlèvement de matière extrudé</translation>
+    </message>
+    <message>
+      <source>Cuts an extrusion from a solid</source>
+      <translation>Coupe une extrusion d&apos;un solide</translation>
+    </message>
+    <message>
+      <source>Extrusion</source>
+      <translation>Extrusion</translation>
+    </message>
+    <message>
+      <source>From</source>
+      <translation>De</translation>
+    </message>
+    <message>
+      <source>To</source>
+      <translation>À</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:CreationMethod</name>
+    <message>
+      <source>By bounding faces and offsets</source>
+      <translation>En délimitant les faces et les décalages</translation>
+    </message>
+    <message>
+      <source>By sizes</source>
+      <translation>Par tailles</translation>
+    </message>
+    <message>
+      <source>Through all</source>
+      <translation>À travers tous</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base</name>
+    <message>
+      <source>Select a sketch face</source>
+      <translation>Sélectionnez une face d&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez une face d&apos;esquisse.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object</name>
+    <message>
+      <source>&lt;base normal&gt;</source>
+      <translation>&lt;base normale&gt;</translation>
+    </message>
+    <message>
+      <source>Direction</source>
+      <translation>Direction</translation>
+    </message>
+    <message>
+      <source>Select an edge for direction</source>
+      <translation>Sélectionnez une arête pour la direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:from_object</name>
+    <message>
+      <source>From face</source>
+      <translation>À l’angle</translation>
+    </message>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:from_offset</name>
+    <message>
+      <source>Offset</source>
+      <translation>Décalage</translation>
+    </message>
+    <message>
+      <source>Offset for bounding plane</source>
+      <translation>Décalage pour le plan englobant</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:from_size</name>
+    <message>
+      <source>From size</source>
+      <translation>À partir de la taille</translation>
+    </message>
+    <message>
+      <source>Size</source>
+      <translation>Taille</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects</name>
+    <message>
+      <source>Cut from:</source>
+      <translation>Coupé de:</translation>
+    </message>
+    <message>
+      <source>Objects to Cut</source>
+      <translation>Objets à couper</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:to_object</name>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+    <message>
+      <source>To face</source>
+      <translation>Jusqu’à la face</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:to_offset</name>
+    <message>
+      <source>Offset</source>
+      <translation>Décalage</translation>
+    </message>
+    <message>
+      <source>Offset for bounding plane</source>
+      <translation>Décalage pour le plan englobant</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:to_size</name>
+    <message>
+      <source>Size</source>
+      <translation>Taille</translation>
+    </message>
+    <message>
+      <source>To size</source>
+      <translation>À la taille</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:sketch</name>
+    <message>
+      <source>Select:&lt;br /&gt; 1. Planar face of non-sketch object or a plane. Sketch creation will be started.&lt;br /&gt; 2. An existing sketch face or contour. Extrusion will be filled by it.&lt;br /&gt; 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+      <translation>Sélectionnez : &lt;br /&gt; 1. Face plane d&apos;un objet non esquissé ou d&apos;un plan. La création de l’esquisse sera lancée. &lt;br /&gt; 2. Une face ou un contour d’esquisse existant. L&apos;extrusion sera remplie par elle. &lt;br /&gt; 3. Une forme de résultat existante de type: contours / arête / sommets. L&apos;extrusion sera remplie par elle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:from_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+    <message>
+      <source>Error: Extrusion algorithm failed.</source>
+      <translation>Erreur : l&apos;algorithme d&apos;extrusion a échoué.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Les objets principaux ne sont pas sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:to_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+    <message>
+      <source>Error: Extrusion algorithm failed.</source>
+      <translation>Erreur : l&apos;algorithme d&apos;extrusion a échoué.</translation>
+    </message>
+  </context>
+
+  <!-- ExtrusionFuse -->
+  <context>
+    <name>ExtrusionFuse</name>
+    <message>
+      <source>ExtrusionFuse</source>
+      <translation>Bossage extrudé</translation>
+    </message>
+    <message>
+      <source>Fuses an extrusion with a solid</source>
+      <translation>Fusionne une extrusion avec un solide</translation>
+    </message>
+    <message>
+      <source>Extrusion</source>
+      <translation>Extrusion</translation>
+    </message>
+    <message>
+      <source>From</source>
+      <translation>De</translation>
+    </message>
+    <message>
+      <source>To</source>
+      <translation>À</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:CreationMethod</name>
+    <message>
+      <source>By bounding faces and offsets</source>
+      <translation>En délimitant les faces et les décalages</translation>
+    </message>
+    <message>
+      <source>By sizes</source>
+      <translation>Par tailles</translation>
+    </message>
+    <message>
+      <source>Through all</source>
+      <translation>À travers tous</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base</name>
+    <message>
+      <source>Select a sketch face</source>
+      <translation>Sélectionnez une face d&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object</name>
+    <message>
+      <source>&lt;base normal&gt;</source>
+      <translation>&lt;base normale&gt;</translation>
+    </message>
+    <message>
+      <source>Direction</source>
+      <translation>Direction</translation>
+    </message>
+    <message>
+      <source>Select an edge for direction</source>
+      <translation>Sélectionnez une arête pour la direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:from_object</name>
+    <message>
+      <source>From face</source>
+      <translation>À l’angle</translation>
+    </message>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:from_offset</name>
+    <message>
+      <source>Offset</source>
+      <translation>Décalage</translation>
+    </message>
+    <message>
+      <source>Offset for bounding plane</source>
+      <translation>Décalage pour le plan englobant</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:from_size</name>
+    <message>
+      <source>From size</source>
+      <translation>À partir de la taille</translation>
+    </message>
+    <message>
+      <source>Size</source>
+      <translation>Taille</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects</name>
+    <message>
+      <source>Fuse with:</source>
+      <translation>Fusionner avec:</translation>
+    </message>
+    <message>
+      <source>Objects to Fuse</source>
+      <translation>Objets à fusionner</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:to_object</name>
+    <message>
+      <source>To face</source>
+      <translation>Jusqu’à la face</translation>
+    </message>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:to_offset</name>
+    <message>
+      <source>Offset</source>
+      <translation>Décalage</translation>
+    </message>
+    <message>
+      <source>Offset for bounding plane</source>
+      <translation>Décalage pour le plan englobant</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:to_size</name>
+    <message>
+      <source>Size</source>
+      <translation>Taille</translation>
+    </message>
+    <message>
+      <source>To size</source>
+      <translation>À la taille</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:sketch</name>
+    <message>
+      <source>Select:&lt;br /&gt; 1. Planar face of non-sketch object or a plane. Sketch creation will be started.&lt;br /&gt; 2. An existing sketch face or contour. Extrusion will be filled by it.&lt;br /&gt; 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+      <translation>Sélectionnez : &lt;br /&gt; 1. Face plane d&apos;un objet non esquissé ou d&apos;un plan. La création de l’esquisse sera lancée. &lt;br /&gt; 2. Une face ou un contour d’esquisse existant. L&apos;extrusion sera remplie par elle. &lt;br /&gt; 3. Une forme de résultat existante de type: contours / arête / sommets. L&apos;extrusion sera remplie par elle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionner des objets de base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:from_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+    <message>
+      <source>Error: Extrusion algorithm failed.</source>
+      <translation>Erreur : l&apos;algorithme d&apos;extrusion a échoué.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Les objets principaux ne sont pas sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:to_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+    <message>
+      <source>Error: Extrusion algorithm failed.</source>
+      <translation>Erreur : l&apos;algorithme d&apos;extrusion a échoué.</translation>
+    </message>
+  </context>
+
+
+  <!-- Fillet -->
+  <context>
+    <name>Fillet</name>
+    <message>
+      <source>Fillet</source>
+      <translation>Congé</translation>
+    </message>
+    <message>
+      <source>Perform fillet on face or edge</source>
+      <translation>Effectuer un congé sur la face ou le bord</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fillet:creation_method</name>
+    <message>
+      <source>Fixed radius</source>
+      <translation>Rayon fixe</translation>
+    </message>
+    <message>
+      <source>Varying radius</source>
+      <translation>Rayon variable</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fillet:main_objects</name>
+    <message>
+      <source>Faces or/and edges</source>
+      <translation>Faces ou/et bords</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fillet:radius1</name>
+    <message>
+      <source>Fillet radius at start point.</source>
+      <translation>Rayon du congé au point de départ.</translation>
+    </message>
+    <message>
+      <source>Fillet radius.</source>
+      <translation>Rayon du congé.</translation>
+    </message>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+    <message>
+      <source>Start radius</source>
+      <translation>Rayon de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fillet:radius2</name>
+    <message>
+      <source>End radius</source>
+      <translation>Rayon de fin</translation>
+    </message>
+    <message>
+      <source>Fillet radius at end point.</source>
+      <translation>Rayon du congé au point final.</translation>
+    </message>
+  </context>
+
+  <!-- Fuse -->
+  <context>
+    <name>Fuse</name>
+    <message>
+      <source>Fuse</source>
+      <translation>Fusionner</translation>
+    </message>
+    <message>
+      <source>Perform boolean fuse operation with objects</source>
+      <translation>Effectuer l’opération booléenne fusion avec des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fuse:FeaturesPlugin_ValidatorBooleanFuseArguments</name>
+    <message>
+      <source>Not enough arguments for Fuse operation.</source>
+      <translation>Pas assez d&apos;arguments pour l&apos;opération Fusionner.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fuse:creation_method</name>
+    <message>
+      <source>Simple</source>
+      <translation>Simple</translation>
+    </message>
+    <message>
+      <source>advanced</source>
+      <translation>avancée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fuse:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Objects</source>
+      <translation>Objets</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fuse:remove_intersection_edges</name>
+    <message>
+      <source>Remove intersection edges</source>
+      <translation>Supprimer les arêtes d&apos;intersection</translation>
+    </message>
+    <message>
+      <source>Remove intersection edges if they laying on the same surface</source>
+      <translation>Supprimez les arêtes d&apos;intersection si elles reposent sur la même surface</translation>
+    </message>
+  </context>
+  <context>
+    <name>Fuse:tool_objects</name>
+    <message>
+      <source>Select tools</source>
+      <translation>Sélectionnez des outils</translation>
+    </message>
+    <message>
+      <source>Tool objects</source>
+      <translation>Objets outils</translation>
+    </message>
+  </context>
+
+  <!-- FusionFaces -->
+  <context>
+    <name>FusionFaces</name>
+    <message>
+      <source>Fuse Faces</source>
+      <translation>Fusionner des faces</translation>
+    </message>
+    <message>
+      <source>Performs fusion of connected faces</source>
+      <translation>Effectue la fusion de faces connectées</translation>
+    </message>
+  </context>
+  <context>
+    <name>FusionFaces:base_shape</name>
+    <message>
+      <source>Select a shape to modify.</source>
+      <translation>Sélectionnez une forme à modifier.</translation>
+    </message>
+    <message>
+      <source>Shape:</source>
+      <translation>Forme:</translation>
+    </message>
+  </context>
+  <context>
+    <name>FusionFaces:base_shape:GeomValidators_BodyShapes</name>
+    <message>
+      <source>Error: Context is empty.</source>
+      <translation>Erreur : le contexte est vide.</translation>
+    </message>
+  </context>
+
+  <!-- Intersection -->
+  <context>
+    <name>Intersection</name>
+    <message>
+      <source>Intersect objects with tools</source>
+      <translation>Intersection d&apos;objets avec des outils</translation>
+    </message>
+    <message>
+      <source>Intersection</source>
+      <translation>Section</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects</name>
+    <message>
+      <source>Objects</source>
+      <translation>Objets</translation>
+    </message>
+    <message>
+      <source>Select objects (compounds, compsolids, solids, shells, faces or edges)</source>
+      <translation>Sélectionner des objets (assemblages, solides composites, coques, faces ou arêtes)</translation>
+    </message>
+  </context>
+
+  <!-- Partition -->
+  <context>
+    <name>Partition</name>
+    <message>
+      <source>Partition</source>
+      <translation>Partition</translation>
+    </message>
+    <message>
+      <source>Perform partition operations with solids</source>
+      <translation>Effectuer des opérations de partition avec des solides</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Attribute "%1" should contain at least %2 items.</source>
+      <translation>Erreur : l&apos;attribut &quot;%1&quot; doit contenir au moins %2 éléments.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:base_objects</name>
+    <message>
+      <source>Base objects:</source>
+      <translation>Objets de base:</translation>
+    </message>
+    <message>
+      <source>Select objects for partitioning.</source>
+      <translation>Sélectionner des objets pour le partitionnement.</translation>
+    </message>
+  </context>
+
+  <!-- Pipe -->
+  <context>
+    <name>Pipe</name>
+    <message>
+      <source>Generates extrusion along a path</source>
+      <translation>Génère une extrusion le long d&apos;un chemin</translation>
+    </message>
+    <message>
+      <source>Pipe</source>
+      <translation>Tuyau</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects</name>
+    <message>
+      <source>Base objects:</source>
+      <translation>Objets de base:</translation>
+    </message>
+    <message>
+      <source>Select a base objects</source>
+      <translation>Sélectionnez un objet de base</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal</name>
+    <message>
+      <source>Bi-Normal:</source>
+      <translation>Bi-normal:</translation>
+    </message>
+    <message>
+      <source>Select an edge for Bi-Normal</source>
+      <translation>Sélectionnez une arête pour Bi-Normal</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:creation_method</name>
+    <message>
+      <source>Pipe by objects, path and Bi-Normal</source>
+      <translation>Tyau par objets, chemin et Bi-Normal</translation>
+    </message>
+    <message>
+      <source>Pipe by objects, path and locations</source>
+      <translation>Tuyau par objets, chemins et emplacements</translation>
+    </message>
+    <message>
+      <source>Simple pipe by objects and path</source>
+      <translation>Tuyau simple par objets et chemin</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:locations_objects</name>
+    <message>
+      <source>Locations:</source>
+      <translation>Emplacements:</translation>
+    </message>
+    <message>
+      <source>Select one or more vertices to specify the locations</source>
+      <translation>Sélectionnez un ou plusieurs sommets pour spécifier les emplacements</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:locations_objects:FeaturesPlugin_ValidatorPipeLocations</name>
+    <message>
+      <source>Error: Empty selection context.</source>
+      <translation>Erreur : contexte de sélection vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:path_object</name>
+    <message>
+      <source>Path object:</source>
+      <translation>Objet chemin:</translation>
+    </message>
+    <message>
+      <source>Select an edge or wire for path</source>
+      <translation>Sélectionnez une arête ou un contour pour le chemin</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionner des objets de base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le vecteur binormal n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:path_object</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez une arête ou un contour pour le chemin.</translation>
+    </message>
+  </context>
+
+  <!-- Recover -->
+  <context>
+    <name>Recover</name>
+    <message>
+      <source>Recover</source>
+      <translation>Récupérer</translation>
+    </message>
+    <message>
+      <source>Visualize concealed objects</source>
+      <translation>Visualiser les objets cachés</translation>
+    </message>
+  </context>
+  <context>
+    <name>Recover:base_feature</name>
+    <message>
+      <source>Feature:</source>
+      <translation>Fonctionnalité:</translation>
+    </message>
+    <message>
+      <source>Select a feature that conceals results.</source>
+      <translation>Sélectionnez une fonctionnalité qui cache les résultats.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Recover:base_feature:FeaturesPlugin_ValidatorConcealedResult</name>
+    <message>
+      <source>Error: Empty feature.</source>
+      <translation>Erreur : fonction vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Recover:method</name>
+    <message>
+      <source>Concealed compounds</source>
+      <translation>Assemblages cachés</translation>
+    </message>
+    <message>
+      <source>Concealed results</source>
+      <translation>Résultats cachés</translation>
+    </message>
+  </context>
+
+  <!-- Remove_SubShapes -->
+  <context>
+    <name>Remove_SubShapes</name>
+    <message>
+      <source>Allows to remove sub-shapes from wires, shells, compsolids and compounds</source>
+      <translation>Permet de supprimer les sous formes de fils, coques, solides composites et assemblages</translation>
+    </message>
+    <message>
+      <source>Remove Sub-Shapes</source>
+      <translation>Supprimer les sous-formes</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape</name>
+    <message>
+      <source>Select a shape to modify.</source>
+      <translation>Sélectionnez une forme à modifier.</translation>
+    </message>
+    <message>
+      <source>Shape:</source>
+      <translation>Forme:</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:creation_method</name>
+    <message>
+      <source>By keeping sub-shapes</source>
+      <translation>En gardant les sous-formes</translation>
+    </message>
+    <message>
+      <source>By removing sub-shapes</source>
+      <translation>En supprimant les sous-formes</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes_to_keep</name>
+    <message>
+      <source>Select shapes to keep.</source>
+      <translation>Sélectionnez des formes à conserver.</translation>
+    </message>
+    <message>
+      <source>Sub-Shapes to keep:</source>
+      <translation>Sous-formes à garder:</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes_to_keep:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes_to_remove</name>
+    <message>
+      <source>Select shapes to remove.</source>
+      <translation>Sélectionnez les formes à supprimer.</translation>
+    </message>
+    <message>
+      <source>Sub-Shapes to remove:</source>
+      <translation>Sous-formes à supprimer:</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes_to_remove:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+
+  <!-- Revolution -->
+  <context>
+    <name>Revolution</name>
+    <message>
+      <source>Create a solid by revolution of a face</source>
+      <translation>Créer un solide par révolution d&apos;une face</translation>
+    </message>
+    <message>
+      <source>Revolution</source>
+      <translation>Révolution</translation>
+    </message>
+    <message>
+      <source>From</source>
+      <translation>De</translation>
+    </message>
+    <message>
+      <source>To</source>
+      <translation>À</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:CreationMethod</name>
+    <message>
+      <source>By angles</source>
+      <translation>Par angles</translation>
+    </message>
+    <message>
+      <source>By bounding planes and angles</source>
+      <translation>En délimitant des plans et des angles</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for axis</source>
+      <translation>Sélectionnez une arête pour l&apos;axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base</name>
+    <message>
+      <source>Base objects:</source>
+      <translation>Objets de base:</translation>
+    </message>
+    <message>
+      <source>Select a base objects</source>
+      <translation>Sélectionnez un objet de base</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:from_angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>From angle</source>
+      <translation>De l&apos;angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:from_object</name>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:from_offset</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angle for "from" bounding plane</source>
+      <translation>Angle pour &quot;à partir du&quot; plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:to_angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>To angle</source>
+      <translation>Jusqu’à l’angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:to_object</name>
+    <message>
+      <source>&lt;base sketch&gt;</source>
+      <translation>&lt;esquisse de base&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:to_offset</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angle for "to" bounding plane</source>
+      <translation>Angle pour &quot;à&quot; plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:sketch</name>
+    <message>
+      <source>Select:&lt;br /&gt; 1. Planar face of non-sketch object or a plane. Sketch creation will be started.&lt;br /&gt; 2. An existing sketch face or contour. Extrusion will be filled by it.&lt;br /&gt; 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+      <translation>Sélectionnez : &lt;br /&gt; 1. Face plane d&apos;un objet non esquissé ou d&apos;un plan. La création de l’esquisse sera lancée. &lt;br /&gt; 2. Une face ou un contour d’esquisse existant. L&apos;extrusion sera remplie par elle. &lt;br /&gt; 3. Une forme de résultat existante de type: contours / arête / sommets. L&apos;extrusion sera remplie par elle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromSize = -ToSize et les plans de délimitation coïncident</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+
+  <!-- RevolutionCut -->
+  <context>
+    <name>RevolutionCut</name>
+    <message>
+      <source>RevolutionCut</source>
+      <translation>Enlèvement de matière avec révolution</translation>
+    </message>
+    <message>
+      <source>Cuts a revolution from a solid</source>
+      <translation>Coupe une révolution d&apos;un solide</translation>
+    </message>
+    <message>
+      <source>From</source>
+      <translation>De</translation>
+    </message>
+    <message>
+      <source>Revolution</source>
+      <translation>Révolution</translation>
+    </message>
+    <message>
+      <source>To</source>
+      <translation>À</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:CreationMethod</name>
+    <message>
+      <source>By angles</source>
+      <translation>Par angles</translation>
+    </message>
+    <message>
+      <source>By bounding planes and angles</source>
+      <translation>En délimitant des plans et des angles</translation>
+    </message>
+    <message>
+      <source>Through all</source>
+      <translation>À travers tous</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for axis</source>
+      <translation>Sélectionnez une arête pour l&apos;axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base</name>
+    <message>
+      <source>Select a sketch face</source>
+      <translation>Sélectionnez une face d&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:from_angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>From angle</source>
+      <translation>De l&apos;angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:from_object</name>
+    <message>
+      <source>&lt;sketch&gt;</source>
+      <translation>&lt;esquisse&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:from_offset</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angle for "from" bounding plane</source>
+      <translation>Angle pour &quot;à partir du&quot; plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects</name>
+    <message>
+      <source>Cut from:</source>
+      <translation>Coupé de:</translation>
+    </message>
+    <message>
+      <source>Objects to Cut</source>
+      <translation>Objets à couper</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:to_angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>To angle</source>
+      <translation>Jusqu’à l’angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:to_object</name>
+    <message>
+      <source>&lt;sketch&gt;</source>
+      <translation>&lt;esquisse&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:to_offset</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angle for "to" bounding plane</source>
+      <translation>Angle pour &quot;à&quot; plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:sketch</name>
+    <message>
+      <source>Select:&lt;br /&gt; 1. Planar face of non-sketch object or a plane. Sketch creation will be started.&lt;br /&gt; 2. An existing sketch face or contour. Extrusion will be filled by it.&lt;br /&gt; 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+      <translation>Sélectionnez : &lt;br /&gt; 1. Face plane d&apos;un objet non esquissé ou d&apos;un plan. La création de l’esquisse sera lancée. &lt;br /&gt; 2. Une face ou un contour d’esquisse existant. L&apos;extrusion sera remplie par elle. &lt;br /&gt; 3. Une forme de résultat existante de type: contours / arête / sommets. L&apos;extrusion sera remplie par elle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Les objets principaux ne sont pas sélectionnés</translation>
+    </message>
+  </context>
+
+  <!-- RevolutionFuse -->
+  <context>
+    <name>RevolutionFuse</name>
+    <message>
+      <source>RevolutionFuse</source>
+      <translation>Bossage avec révolution</translation>
+    </message>
+    <message>
+      <source>Fuses a revolution with a solid</source>
+      <translation>Fusionne une révolution avec un solide</translation>
+    </message>
+    <message>
+      <source>From</source>
+      <translation>De</translation>
+    </message>
+    <message>
+      <source>Revolution</source>
+      <translation>Révolution</translation>
+    </message>
+    <message>
+      <source>To</source>
+      <translation>À</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:CreationMethod</name>
+    <message>
+      <source>By angles</source>
+      <translation>Par angles</translation>
+    </message>
+    <message>
+      <source>By bounding planes and angles</source>
+      <translation>En délimitant des plans et des angles</translation>
+    </message>
+    <message>
+      <source>Through all</source>
+      <translation>À travers tous</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for axis</source>
+      <translation>Sélectionnez une arête pour l&apos;axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base</name>
+    <message>
+      <source>Select a sketch face</source>
+      <translation>Sélectionnez une face d&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:from_angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>From angle</source>
+      <translation>De l&apos;angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:from_object</name>
+    <message>
+      <source>&lt;sketch&gt;</source>
+      <translation>&lt;esquisse&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:from_offset</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angle for "from" bounding plane</source>
+      <translation>Angle pour &quot;à partir du&quot; plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects</name>
+    <message>
+      <source>Fuse with:</source>
+      <translation>Fusionner avec:</translation>
+    </message>
+    <message>
+      <source>Objects to Fuse</source>
+      <translation>Objets à fusionner</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:to_angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>To angle</source>
+      <translation>Jusqu’à l’angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:to_object</name>
+    <message>
+      <source>&lt;sketch&gt;</source>
+      <translation>&lt;esquisse&gt;</translation>
+    </message>
+    <message>
+      <source>Bounding plane (select a planar face)</source>
+      <translation>Plan englobant (sélectionnez une face plane)</translation>
+    </message>
+    <message>
+      <source>Plane face</source>
+      <translation>Face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:to_offset</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angle for "to" bounding plane</source>
+      <translation>Angle pour &quot;à&quot; plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:sketch</name>
+    <message>
+      <source>Select:&lt;br /&gt; 1. Planar face of non-sketch object or a plane. Sketch creation will be started.&lt;br /&gt; 2. An existing sketch face or contour. Extrusion will be filled by it.&lt;br /&gt; 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+      <translation>Sélectionnez : &lt;br /&gt; 1. Face plane d&apos;un objet non esquissé ou d&apos;un plan. La création de l’esquisse sera lancée. &lt;br /&gt; 2. Une face ou un contour d’esquisse existant. L&apos;extrusion sera remplie par elle. &lt;br /&gt; 3. Une forme de résultat existante de type: contours / arête / sommets. L&apos;extrusion sera remplie par elle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Les objets principaux ne sont pas sélectionnés</translation>
+    </message>
+  </context>
+
+  <!-- Scale -->
+  <context>
+    <name>Scale</name>
+    <message>
+      <source>Perform scale objects</source>
+      <translation>Effectuer un changement d’échelle des objets</translation>
+    </message>
+    <message>
+      <source>Scale</source>
+      <translation>Échelle</translation>
+    </message>
+  </context>
+  <context>
+    <name>Scale:CreationMethod</name>
+    <message>
+      <source>By one common factor for the three directions</source>
+      <translation>Par un facteur commun aux trois directions</translation>
+    </message>
+    <message>
+      <source>Different factors for the three directions</source>
+      <translation>Différents facteurs pour les trois directions</translation>
+    </message>
+  </context>
+  <context>
+    <name>Scale:center_point</name>
+    <message>
+      <source>Center point</source>
+      <translation>Point central</translation>
+    </message>
+    <message>
+      <source>Select the center point</source>
+      <translation>Sélectionnez le point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>Scale:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Scale:scale_factor</name>
+    <message>
+      <source>Scale factor</source>
+      <translation>Facteur d&apos;échelle</translation>
+    </message>
+  </context>
+  <context>
+    <name>Scale:scale_factor_x</name>
+    <message>
+      <source>Scale factor in X</source>
+      <translation>Facteur d&apos;échelle suivant X</translation>
+    </message>
+  </context>
+  <context>
+    <name>Scale:scale_factor_y</name>
+    <message>
+      <source>Scale factor in Y</source>
+      <translation>Facteur d&apos;échelle suivant Y</translation>
+    </message>
+  </context>
+  <context>
+    <name>Scale:scale_factor_z</name>
+    <message>
+      <source>Scale factor in Z</source>
+      <translation>Facteur d&apos;échelle suivant Z</translation>
+    </message>
+  </context>
+
+  <!-- Smash -->
+  <context>
+    <name>Smash</name>
+    <message>
+      <source>Perform boolean smash operation with objects</source>
+      <translation>Effectuer l’opération booléenne smash avec des objets</translation>
+    </message>
+    <message>
+      <source>Smash</source>
+      <translation>Smash</translation>
+    </message>
+  </context>
+  <context>
+    <name>Smash:FeaturesPlugin_ValidatorBooleanArguments</name>
+    <message>
+      <source>Objects not selected.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Smash:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Smash:tool_objects</name>
+    <message>
+      <source>Select tools</source>
+      <translation>Sélectionnez des outils</translation>
+    </message>
+    <message>
+      <source>Tool objects</source>
+      <translation>Objets outils</translation>
+    </message>
+  </context>
+  <context>
+    <name>Smash:FeaturesPlugin_ValidatorBooleanArguments</name>
+    <message>
+      <source>Tools not selected.</source>
+      <translation>Les objets outils ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+
+  <!-- Split -->
+  <context>
+    <name>Split</name>
+    <message>
+      <source>Perform boolean split operation with objects</source>
+      <translation>Effectuer l’opération booléenne division avec des objets</translation>
+    </message>
+    <message>
+      <source>Split</source>
+      <translation>Diviser</translation>
+    </message>
+  </context>
+  <context>
+    <name>Split:FeaturesPlugin_ValidatorBooleanArguments</name>
+    <message>
+      <source>Objects not selected.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Split:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Split:tool_objects</name>
+    <message>
+      <source>Select tools</source>
+      <translation>Sélectionnez des outils</translation>
+    </message>
+    <message>
+      <source>Tool objects</source>
+      <translation>Objets outils</translation>
+    </message>
+  </context>
+
+  <!-- Union -->
+  <context>
+    <name>Union</name>
+    <message>
+      <source>Perform union operations with shapes</source>
+      <translation>Effectuer des opérations réunion avec des formes</translation>
+    </message>
+    <message>
+      <source>Union</source>
+      <translation>Réunion</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:base_objects</name>
+    <message>
+      <source>Base objects:</source>
+      <translation>Objets de base:</translation>
+    </message>
+    <message>
+      <source>Select solids for union.</source>
+      <translation>Sélectionner les solides pour la réunion.</translation>
+    </message>
+  </context>
+
+  <!-- Validators -->
+
+  <context>
+    <name>Scale:center_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromSize = -ToSize et les plans de délimitation coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;objet de base pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>ToSize = -FromSize.</source>
+      <translation>ToSize = -FromSize.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:FeaturesPlugin_ValidatorExtrusionDir</name>
+    <message>
+      <source>Error: Validator should be used with 2 parameters for extrusion.</source>
+      <translation>Validateur &quot;FeaturesPlugin_ValidatorExtrusionDir&quot; doit être utilisé avec 2 paramètres d&apos;extrusion.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:FeaturesPlugin_ValidatorExtrusionDir</name>
+    <message>
+      <source>Error: Direction is parallel to one of the selected face or face on selected shell.</source>
+      <translation>La direction est parallèle à l&apos;une des faces sélectionnées ou à la face de la coque sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "sketch" is not initialized.</source>
+      <translation>L&apos;objet de base pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base" is not initialized.</source>
+      <translation>L&apos;objet de base pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "direction_object" is not initialized.</source>
+      <translation>L&apos;objet Direction pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "from_object" is not initialized.</source>
+      <translation>L’objet de départ pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "to_object" is not initialized.</source>
+      <translation>L’objet destination de l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: The attribute with the %1 type is not processed</source>
+      <translation>Erreur : l&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: Wrong parameters in XML definition for %1 type</source>
+      <translation>Erreur : paramètres incorrects dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Wrong parameters in XML definition for %1 type</source>
+      <translation>Mauvais paramètres dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Validator parameters is empty.</source>
+      <translation>Erreur : les paramètres du validateur sont vides.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute contains unacceptable shape.</source>
+      <translation>Le type d’une forme sélectionnée n’est pas acceptable.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Compound should contain only faces, edges or vertices.</source>
+      <translation>L’assemblage doit contenir uniquement des faces, des arêtes ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Object from this sketch is already selected. Sketch is not allowed for selection.</source>
+      <translation>L&apos;objet de cette esquisse est déjà sélectionné. L&apos;esquisse n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Whole sketch with this object is already selected. Don't allow to select this object.</source>
+      <translation>L&apos;esquisse entière avec cet objet est déjà sélectionnée. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Wire with wrong orientation selected.</source>
+      <translation>Contour avec mauvaise orientation sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Objects with this wire already selected. Don't allow to select this object.</source>
+      <translation>Les objets de ce contour sont déjà sélectionnés. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty attribute.</source>
+      <translation>Erreur : attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute have empty context.</source>
+      <translation>Erreur : l&apos;attribut a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty shape selected</source>
+      <translation>Erreur : forme vide sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Infinite constructions is not allowed as base.</source>
+      <translation>Les constructions infinies ne sont pas autorisées comme base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, whole sketch (if it has at least one face), and whole objects with shape types: %1</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé. Les types acceptables sont les suivants: faces ou contours sur l&apos;esquisse, esquisse entière (si elle possède au moins une face) et objets entiers des types de forme: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Objet de direction non sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Objet de direction non sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Objet de direction non sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>Wrong number of validator arguments in xml (expected 9).</source>
+      <translation>Nombre incorrect d&apos;arguments de validation dans XML (9 prévus).</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>ToSize = -FromSize.</source>
+      <translation>ToSize = -FromSize.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromSize = -ToSize et les plans de délimitation coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:FeaturesPlugin_ValidatorExtrusionDir</name>
+    <message>
+      <source>Error: Base objects list contains vertex or edge, so attribute "direction_object" can not be used with default value. Select direction for extrusion.</source>
+      <translation>La liste des objets de base contient un sommet ou une arête, ainsi la direction par défaut ne peut pas être utilisée. Sélectionnez la direction d&apos;extrusion.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:from_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+    <message>
+      <source>Error: Extrusion algorithm failed.</source>
+      <translation>Erreur : l&apos;algorithme d&apos;extrusion a échoué.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Extrusion:to_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+    <message>
+      <source>Error: Extrusion algorithm failed.</source>
+      <translation>Erreur : l&apos;algorithme d&apos;extrusion a échoué.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromSize = -ToSize et les plans de délimitation coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:Model_FeatureValidator</name>
+    <message>
+      <source> Attribute "base" is not initialized.</source>
+      <translation>L&apos;objet de base pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: </source>
+      <translation>Les objets sélectionnés contiennent un élément avec un type de forme non autorisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:FeaturesPlugin_ValidatorExtrusionDir</name>
+    <message>
+      <source>Error: Validator should be used with 2 parameters for extrusion.</source>
+      <translation>Validateur &quot;FeaturesPlugin_ValidatorExtrusionDir&quot; doit être utilisé avec 2 paramètres d&apos;extrusion.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:FeaturesPlugin_ValidatorExtrusionDir</name>
+    <message>
+      <source>Error: Direction is parallel to one of the selected face or face on selected shell.</source>
+      <translation>La direction est parallèle à l&apos;une des faces sélectionnées ou à la face de la coque sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "sketch" is not initialized.</source>
+      <translation>L&apos;objet de base pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "direction_object" is not initialized.</source>
+      <translation>L&apos;objet Direction pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "from_object" is not initialized.</source>
+      <translation>L’objet de départ pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "to_object" is not initialized.</source>
+      <translation>L’objet destination de l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "to_offset" is not initialized.</source>
+      <translation>Entrez le décalage &quot;jusqu’à&quot;.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>Les objets à couper ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: The attribute with the %1 type is not processed</source>
+      <translation>Erreur : l&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: Wrong parameters in XML definition for %1 type</source>
+      <translation>Erreur : paramètres incorrects dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Wrong parameters in XML definition for %1 type</source>
+      <translation>Mauvais paramètres dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Validator parameters is empty.</source>
+      <translation>Erreur : les paramètres du validateur sont vides.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute contains unacceptable shape.</source>
+      <translation>Le type d’une forme sélectionnée n’est pas acceptable.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Compound should contain only faces, edges or vertices.</source>
+      <translation>L’assemblage doit contenir uniquement des faces, des arêtes ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Object from this sketch is already selected. Sketch is not allowed for selection.</source>
+      <translation>L&apos;objet de cette esquisse est déjà sélectionné. L&apos;esquisse n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Whole sketch with this object is already selected. Don't allow to select this object.</source>
+      <translation>L&apos;esquisse entière avec cet objet est déjà sélectionnée. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Wire with wrong orientation selected.</source>
+      <translation>Contour avec mauvaise orientation sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Objects with this wire already selected. Don't allow to select this object.</source>
+      <translation>Les objets de ce contour sont déjà sélectionnés. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty attribute.</source>
+      <translation>Sélectionner des objets de base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut</name>
+    <message>
+      <source>base - FeaturesPlugin_ValidatorBaseForGeneration: Error: Attribute have empty context.</source>
+      <translation>L&apos;objet sélectionné est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty shape selected</source>
+      <translation>Erreur : forme vide sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Infinite constructions is not allowed as base.</source>
+      <translation>Les constructions infinies ne sont pas autorisées comme base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, whole sketch (if it has at least one face), and whole objects with shape types: %1</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé. Les types acceptables sont les suivants: faces ou contours sur l&apos;esquisse, esquisse entière (si elle possède au moins une face) et objets entiers des types de forme: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>Wrong number of validator arguments in xml (expected 9).</source>
+      <translation>Nombre incorrect d&apos;arguments de validation dans XML (9 prévus).</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>ToSize = -FromSize.</source>
+      <translation>ToSize = -FromSize.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromSize = -ToSize et les plans de délimitation coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>Wrong number of validator arguments in xml (expected 9).</source>
+      <translation>Nombre incorrect d&apos;arguments du validateur &quot;GeomValidators_ZeroOffset&quot; en XML (9 attendus).</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>ToSize = -FromSize.</source>
+      <translation>ToAngle = -FromAngle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "sketch" is not initialized.</source>
+      <translation>L&apos;objet de base pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base" is not initialized.</source>
+      <translation>L&apos;objet de base pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "from_object" is not initialized.</source>
+      <translation>L&apos;objet de départ pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "to_object" is not initialized.</source>
+      <translation>L’objet destination de la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: The attribute with the %1 type is not processed</source>
+      <translation>Erreur : l&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: Wrong parameters in XML definition for %1 type</source>
+      <translation>Erreur : paramètres incorrects dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Wrong parameters in XML definition for %1 type</source>
+      <translation>Mauvais paramètres dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Validator parameters is empty.</source>
+      <translation>Erreur : les paramètres du validateur sont vides.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute contains unacceptable shape.</source>
+      <translation>Le type d’une forme sélectionnée n’est pas acceptable.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Compound should contain only faces, edges or vertices.</source>
+      <translation>L’assemblage doit contenir uniquement des faces, des arêtes ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Object from this sketch is already selected. Sketch is not allowed for selection.</source>
+      <translation>L&apos;objet de cette esquisse est déjà sélectionné. L&apos;esquisse n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Whole sketch with this object is already selected. Don't allow to select this object.</source>
+      <translation>L&apos;esquisse entière avec cet objet est déjà sélectionnée. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Wire with wrong orientation selected.</source>
+      <translation>Contour avec mauvaise orientation sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Objects with this wire already selected. Don't allow to select this object.</source>
+      <translation>Les objets de ce contour sont déjà sélectionnés. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty attribute.</source>
+      <translation>Erreur : attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute have empty context.</source>
+      <translation>Erreur : l&apos;attribut a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty shape selected</source>
+      <translation>Erreur : forme vide sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Infinite constructions is not allowed as base.</source>
+      <translation>Les constructions infinies ne sont pas autorisées comme base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, whole sketch (if it has at least one face), and whole objects with shape types: %1</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé. Les types acceptables sont les suivants: faces ou contours sur l&apos;esquisse, esquisse entière (si elle possède au moins une face) et objets entiers des types de forme: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Revolution:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromAngle = -ToAngle et les plans englobants coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: </source>
+      <translation>Les objets sélectionnés contiennent un élément avec un type de forme non autorisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>Wrong number of validator arguments in xml (expected 9).</source>
+      <translation>Nombre incorrect d&apos;arguments du validateur &quot;GeomValidators_ZeroOffset&quot; en XML (9 attendus).</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>ToSize = -FromSize.</source>
+      <translation>ToAngle = -FromAngle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "sketch" is not initialized.</source>
+      <translation>L&apos;objet de base pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base" is not initialized.</source>
+      <translation>L&apos;objet de base pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "from_object" is not initialized.</source>
+      <translation>L&apos;objet de départ pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "to_object" is not initialized.</source>
+      <translation>L’objet destination de la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>L’objet à couper n’est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: The attribute with the %1 type is not processed</source>
+      <translation>Erreur : l&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: Wrong parameters in XML definition for %1 type</source>
+      <translation>Erreur : paramètres incorrects dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Wrong parameters in XML definition for %1 type</source>
+      <translation>Mauvais paramètres dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Validator parameters is empty.</source>
+      <translation>Erreur : les paramètres du validateur sont vides.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute contains unacceptable shape.</source>
+      <translation>Le type d’une forme sélectionnée n’est pas acceptable.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Compound should contain only faces, edges or vertices.</source>
+      <translation>L’assemblage doit contenir uniquement des faces, des arêtes ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Object from this sketch is already selected. Sketch is not allowed for selection.</source>
+      <translation>L&apos;objet de cette esquisse est déjà sélectionné. L&apos;esquisse n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Whole sketch with this object is already selected. Don't allow to select this object.</source>
+      <translation>L&apos;esquisse entière avec cet objet est déjà sélectionnée. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Wire with wrong orientation selected.</source>
+      <translation>Contour avec mauvaise orientation sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Objects with this wire already selected. Don't allow to select this object.</source>
+      <translation>Les objets de ce contour sont déjà sélectionnés. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty attribute.</source>
+      <translation>Erreur : attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute have empty context.</source>
+      <translation>Erreur : l&apos;attribut a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty shape selected</source>
+      <translation>Erreur : forme vide sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Infinite constructions is not allowed as base.</source>
+      <translation>Les constructions infinies ne sont pas autorisées comme base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, whole sketch (if it has at least one face), and whole objects with shape types: %1</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé. Les types acceptables sont les suivants: faces ou contours sur l&apos;esquisse, esquisse entière (si elle possède au moins une face) et objets entiers des types de forme: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromSize = -ToSize et les plans de délimitation coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base" is not initialized.</source>
+      <translation>Les objets de base pour l&apos;extrusion ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: </source>
+      <translation>Les objets sélectionnés contiennent un élément avec un type de forme non autorisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:FeaturesPlugin_ValidatorExtrusionDir</name>
+    <message>
+      <source>Error: Validator should be used with 2 parameters for extrusion.</source>
+      <translation>Validateur &quot;FeaturesPlugin_ValidatorExtrusionDir&quot; doit être utilisé avec 2 paramètres d&apos;extrusion.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:FeaturesPlugin_ValidatorExtrusionDir</name>
+    <message>
+      <source>Error: Direction is parallel to one of the selected face or face on selected shell.</source>
+      <translation>La direction est parallèle à l&apos;une des faces sélectionnées ou à la face de la coque sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "sketch" is not initialized.</source>
+      <translation>L&apos;objet de base pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base" is not initialized.</source>
+      <translation>Les objets de base pour l&apos;extrusion ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "direction_object" is not initialized.</source>
+      <translation>L&apos;objet Direction pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "from_object" is not initialized.</source>
+      <translation>L’objet de départ pour l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "to_object" is not initialized.</source>
+      <translation>L’objet destination de l&apos;extrusion n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>Les objets à fusionner ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: The attribute with the %1 type is not processed</source>
+      <translation>Erreur : l&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: Wrong parameters in XML definition for %1 type</source>
+      <translation>Erreur : paramètres incorrects dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Wrong parameters in XML definition for %1 type</source>
+      <translation>Mauvais paramètres dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Validator parameters is empty.</source>
+      <translation>Erreur : les paramètres du validateur sont vides.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute contains unacceptable shape.</source>
+      <translation>Le type d’une forme sélectionnée n’est pas acceptable.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Compound should contain only faces, edges or vertices.</source>
+      <translation>L’assemblage doit contenir uniquement des faces, des arêtes ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Object from this sketch is already selected. Sketch is not allowed for selection.</source>
+      <translation>L&apos;objet de cette esquisse est déjà sélectionné. L&apos;esquisse n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Whole sketch with this object is already selected. Don't allow to select this object.</source>
+      <translation>L&apos;esquisse entière avec cet objet est déjà sélectionnée. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Wire with wrong orientation selected.</source>
+      <translation>Contour avec mauvaise orientation sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Objects with this wire already selected. Don't allow to select this object.</source>
+      <translation>Les objets de ce contour sont déjà sélectionnés. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty attribute.</source>
+      <translation>Erreur : attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute have empty context.</source>
+      <translation>Erreur : l&apos;attribut a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty shape selected</source>
+      <translation>Erreur : forme vide sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Infinite constructions is not allowed as base.</source>
+      <translation>Les constructions infinies ne sont pas autorisées comme base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, whole sketch (if it has at least one face), and whole objects with shape types: %1</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé. Les types acceptables sont les suivants: faces ou contours sur l&apos;esquisse, esquisse entière (si elle possède au moins une face) et objets entiers des types de forme: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>Wrong number of validator arguments in xml (expected 9).</source>
+      <translation>Nombre incorrect d&apos;arguments de validation dans XML (9 prévus).</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>ToSize = -FromSize.</source>
+      <translation>ToSize = -FromSize.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ExtrusionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromSize = -ToSize et les plans de délimitation coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>FromSize = -ToSize and bounding planes are coincident.</source>
+      <translation>FromAngle = -ToAngle et les plans englobants coïncident.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: </source>
+      <translation>Les objets sélectionnés contiennent un élément avec un type de forme non autorisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>Wrong number of validator arguments in xml (expected 9).</source>
+      <translation>Nombre incorrect d&apos;arguments du validateur &quot;GeomValidators_ZeroOffset&quot; en XML (9 attendus).</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>ToSize = -FromSize.</source>
+      <translation>ToAngle = -FromAngle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>From face selection is invalid.</source>
+      <translation>La face de départ sélectionnée est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:GeomValidators_ZeroOffset</name>
+    <message>
+      <source>To face selection is invalid.</source>
+      <translation>La sélection de la face finale est invalide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "sketch" is not initialized.</source>
+      <translation>L&apos;objet de base pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base" is not initialized.</source>
+      <translation>L&apos;objet de base pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "from_object" is not initialized.</source>
+      <translation>L&apos;objet de départ pour la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "to_object" is not initialized.</source>
+      <translation>L’objet destination de la révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>Les objets à fusionner ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: The attribute with the %1 type is not processed</source>
+      <translation>Erreur : l&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Error: Wrong parameters in XML definition for %1 type</source>
+      <translation>Erreur : paramètres incorrects dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+    <message>
+      <source>Wrong parameters in XML definition for %1 type</source>
+      <translation>Mauvais paramètres dans la définition XML pour le type %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Validator parameters is empty.</source>
+      <translation>Erreur : les paramètres du validateur sont vides.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute contains unacceptable shape.</source>
+      <translation>Le type d’une forme sélectionnée n’est pas acceptable.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Compound should contain only faces, edges or vertices.</source>
+      <translation>L’assemblage doit contenir uniquement des faces, des arêtes ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Object from this sketch is already selected. Sketch is not allowed for selection.</source>
+      <translation>L&apos;objet de cette esquisse est déjà sélectionné. L&apos;esquisse n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Whole sketch with this object is already selected. Don't allow to select this object.</source>
+      <translation>L&apos;esquisse entière avec cet objet est déjà sélectionnée. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Wire with wrong orientation selected.</source>
+      <translation>Contour avec mauvaise orientation sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Objects with this wire already selected. Don't allow to select this object.</source>
+      <translation>Les objets de ce contour sont déjà sélectionnés. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty attribute.</source>
+      <translation>Erreur : attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute have empty context.</source>
+      <translation>Erreur : l&apos;attribut a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty shape selected</source>
+      <translation>Erreur : forme vide sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Infinite constructions is not allowed as base.</source>
+      <translation>Les constructions infinies ne sont pas autorisées comme base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:base:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, whole sketch (if it has at least one face), and whole objects with shape types: %1</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé. Les types acceptables sont les suivants: faces ou contours sur l&apos;esquisse, esquisse entière (si elle possède au moins une face) et objets entiers des types de forme: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de révolution n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:from_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>La forme n&apos;est pas un cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:to_object:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>La forme n&apos;est pas une face disponible.</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean</name>
+    <message>
+      <source>Boolean</source>
+      <translation>Booléen</translation>
+    </message>
+    <message>
+      <source>Boolean operations with objects</source>
+      <translation>Opérations booléennes avec des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean:bool_type</name>
+    <message>
+      <source>Operation type</source>
+      <translation>Type d&apos;opération</translation>
+    </message>
+    <message>
+      <source>Type of boolean operation</source>
+      <translation>Type d&apos;opération booléenne</translation>
+    </message>
+    <message>
+      <source>Cut</source>
+      <translation>Découpe</translation>
+    </message>
+    <message>
+      <source>Fuse</source>
+      <translation>Fusionner</translation>
+    </message>
+    <message>
+      <source>Common</source>
+      <translation>Intersection</translation>
+    </message>
+    <message>
+      <source>Fill</source>
+      <translation>Remplir</translation>
+    </message>
+    <message>
+      <source>Smash</source>
+      <translation>Smash</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean:main_objects:FeaturesPlugin_ValidatorBooleanSelection</name>
+    <message>
+      <source>Error: Empty attribute selection.</source>
+      <translation>Sélectionner des objets.</translation>
+    </message>
+    <message>
+      <source>Error: Empty selection context.</source>
+      <translation>Objet sélectionné invalide.</translation>
+    </message>
+    <message>
+      <source>Error: Result construction not allowed for selection.</source>
+      <translation>Résultat de construction non autorisé pour la sélection.</translation>
+    </message>
+    <message>
+      <source>Error: Empty shape.</source>
+      <translation>Objet sélectionné invalide.</translation>
+    </message>
+    <message>
+      <source>Error: Local selection not allowed.</source>
+      <translation>Sélection locale non autorisée.</translation>
+    </message>
+    <message>
+      <source>Error: Selected shape has the wrong type.</source>
+      <translation>La forme sélectionnée est du mauvais type.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean:tool_objects</name>
+    <message>
+      <source>Tool objects</source>
+      <translation>Objets outils</translation>
+    </message>
+    <message>
+      <source>Select tools</source>
+      <translation>Sélectionnez des outils</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean:tool_objects:FeaturesPlugin_ValidatorBooleanSelection</name>
+    <message>
+      <source>Error: Empty attribute selection.</source>
+      <translation>Sélectionnez des outils.</translation>
+    </message>
+    <message>
+      <source>Error: Empty selection context.</source>
+      <translation>Outil sélectionné non valide.</translation>
+    </message>
+    <message>
+      <source>Error: Result construction not allowed for selection.</source>
+      <translation>Résultat de construction non autorisé pour la sélection.</translation>
+    </message>
+    <message>
+      <source>Error: Empty shape.</source>
+      <translation>Outil sélectionné non valide.</translation>
+    </message>
+    <message>
+      <source>Error: Local selection not allowed.</source>
+      <translation>Sélection locale non autorisée.</translation>
+    </message>
+    <message>
+      <source>Error: Selected shape has the wrong type.</source>
+      <translation>La forme sélectionnée est du mauvais type.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean:GeomValidators_BooleanArguments</name>
+    <message>
+      <source>Not enough arguments</source>
+      <translation>Pas assez d&apos;arguments.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Boolean:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "bool_type" is not initialized.</source>
+      <translation>Sélectionnez le type d&apos;opération.</translation>
+    </message>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>Sélectionner des objets.</translation>
+    </message>
+    <message>
+      <source>Attribute "tool_objects" is not initialized.</source>
+      <translation>Sélectionnez des outils.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Attribute \"%1\" should contain at least %2 items.</source>
+      <translation>Au moins %2 objets doivent être sélectionnés dans &quot;%1&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Wrong number of arguments (expected 2): selection list id and min number of objects</source>
+      <translation>Nombre incorrect de validateurs &quot;GeomValidators_MinObjectsSelected&quot; (2 attendus) : id de la liste de sélection et nombre minimal d&apos;objets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Could not get attribute \"%1\".</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:base_objects:FeaturesPlugin_ValidatorPartitionSelection</name>
+    <message>
+      <source>Error: This validator can only work with selection list in \"Partition\" feature.</source>
+      <translation>Erreur : ce validateur ne peut fonctionner qu&apos;avec une liste de sélection dans la fonctionnalité \"Partition\".</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:base_objects:FeaturesPlugin_ValidatorPartitionSelection</name>
+    <message>
+      <source>Error: Only body shapes and construction planes are allowed for selection.</source>
+      <translation>Seuls les formes et les plans de construction sont autorisés pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Partition:base_objects:FeaturesPlugin_ValidatorPartitionSelection</name>
+    <message>
+      <source>Error: Only body shapes and construction planes are allowed for selection.</source>
+      <translation>Seuls les formes et les plans de construction sont autorisés pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>L&apos;objet de base pour le tuyau n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "binormal" is not initialized.</source>
+      <translation>Le vecteur binormal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "path_object" is not initialized.</source>
+      <translation>L&apos;objet pour le chemin de canal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le vecteur binormal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:path_object:FeaturesPlugin_ValidatorPipePath</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>L&apos;objet pour le chemin de canal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:FeaturesPlugin_ValidatorPipeLocations</name>
+    <message>
+      <source>Error: Could not get \"%1\" attribute.</source>
+      <translation>Impossible d&apos;obtenir l&apos;attribut &quot; %1&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:FeaturesPlugin_ValidatorPipeLocations</name>
+    <message>
+      <source>Error: Number of locations should be the same as base objects.</source>
+      <translation>Le nombre d&apos;emplacements doit être identique à celui des objets de base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>L&apos;objet de base pour le tuyau n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "path_object" is not initialized.</source>
+      <translation>L&apos;objet pour le chemin de canal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "binormal" is not initialized.</source>
+      <translation>Le vecteur binormal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "locations_objects" is not initialized.</source>
+      <translation>Emplacements non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Validator parameters is empty.</source>
+      <translation>Erreur : les paramètres du validateur sont vides.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute contains unacceptable shape.</source>
+      <translation>Erreur : l&apos;attribut contient une forme inacceptable.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>Erreur : contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Compound should contain only faces, edges or vertices.</source>
+      <translation>L’assemblage doit contenir uniquement des faces, des arêtes ou des sommets.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Object from this sketch is already selected. Sketch is not allowed for selection.</source>
+      <translation>L&apos;objet de cette esquisse est déjà sélectionné. L&apos;esquisse n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Whole sketch with this object is already selected. Don't allow to select this object.</source>
+      <translation>L&apos;esquisse entière avec cet objet est déjà sélectionnée. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Wire with wrong orientation selected.</source>
+      <translation>Contour avec mauvaise orientation sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Objects with this wire already selected. Don't allow to select this object.</source>
+      <translation>Les objets de ce contour sont déjà sélectionnés. Ne pas autoriser à sélectionner cet objet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty attribute.</source>
+      <translation>Erreur : attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Attribute have empty context.</source>
+      <translation>Erreur : l&apos;attribut a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Empty shape selected</source>
+      <translation>Erreur : forme vide sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Infinite constructions is not allowed as base.</source>
+      <translation>Les constructions infinies ne sont pas autorisées comme base.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape is in the local selection. Only global selection is allowed.</source>
+      <translation>La forme sélectionnée est dans la sélection locale. Seule la sélection globale est autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:base_objects:FeaturesPlugin_ValidatorBaseForGeneration</name>
+    <message>
+      <source>Error: Selected shape has unacceptable type. Acceptable types are: faces or wires on sketch, whole sketch (if it has at least one face), and whole objects with shape types: %1</source>
+      <translation>Le type de la forme sélectionnée n’est pas autorisé. Les types acceptables sont les suivants: faces ou contours sur l&apos;esquisse, esquisse entière (si elle possède au moins une face) et objets entiers des types de forme: %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:path_object:FeaturesPlugin_ValidatorPipePath</name>
+    <message>
+      <source>Error: This validator can only work with path selector in \"Pipe\" feature.</source>
+      <translation>Erreur : ce validateur ne peut fonctionner qu&apos;avec le sélecteur de chemin dans la fonctionnalité \"Tuyau\".</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:path_object:FeaturesPlugin_ValidatorPipePath</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>L&apos;objet pour le chemin de canal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:path_object:FeaturesPlugin_ValidatorPipePath</name>
+    <message>
+      <source>Error: Local selection of wires not allowed.</source>
+      <translation>Sélection locale des contours non autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le vecteur binormal n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Pipe:binormal:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:FeaturesPlugin_ValidatorRemoveSubShapesResult</name>
+    <message>
+      <source>Error: Base shape is empty.</source>
+      <translation>La forme de base n&apos;est pas sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_BodyShapes</name>
+    <message>
+      <source>Error: Context is empty.</source>
+      <translation>L&apos;objet sélectionné a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>L&apos;objet sélectionné a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:FeaturesPlugin_ValidatorRemoveSubShapesResult</name>
+    <message>
+      <source>Error: Could not get \"%1\" attribute.</source>
+      <translation>Impossible d&apos;obtenir l&apos;attribut &quot; %1&quot;.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:FeaturesPlugin_ValidatorRemoveSubShapesResult</name>
+    <message>
+      <source>Error: Base shape is empty.</source>
+      <translation>La forme de base n&apos;est pas sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:FeaturesPlugin_ValidatorRemoveSubShapesResult</name>
+    <message>
+      <source>Error: Resulting shape is not valid.</source>
+      <translation>La forme résultante n&apos;est pas valide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_shape" is not initialized.</source>
+      <translation>La forme de base n&apos;est pas sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "subshapes" is not initialized.</source>
+      <translation>Les sous-formes ne sont pas sélectionnées.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La forme est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_BodyShapes</name>
+    <message>
+      <source>Error: Context is empty.</source>
+      <translation>L&apos;objet sélectionné a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:base_shape:GeomValidators_BodyShapes</name>
+    <message>
+      <source>Error: Result construction selected.</source>
+      <translation>Erreur : construction du résultat sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: This validator can only work with selection list in \"Remove Sub-Shapes\" feature.</source>
+      <translation>Erreur : ce validateur ne peut fonctionner qu&apos;avec la liste de sélection de la fonction \"Supprimer les sous-formes\".</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: Could not get \"%1\" attribute.</source>
+      <translation>Erreur : impossible d&apos;obtenir l&apos;attribut \"%1\".</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: Empty context.</source>
+      <translation>L&apos;objet sélectionné a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: Empty base shape.</source>
+      <translation>Forme de base non sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Remove_SubShapes:subshapes:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+    <message>
+      <source>Error: Only sub-shapes of selected shape is allowed for selection.</source>
+      <translation>Seules les sous-formes de la forme sélectionnée sont autorisées pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>Les objets principaux ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "tool_objects" is not initialized.</source>
+      <translation>Les objets outils ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty selection.</source>
+      <translation>Sélection vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty attribute selection.</source>
+      <translation>La sélection d&apos;attribut est vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty selection context.</source>
+      <translation>L&apos;objet sélectionné a un contexte vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty feature.</source>
+      <translation>Les objets sélectionnés ont une fonctionnalité vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: %1 shape is not allowed for selection.</source>
+      <translation>La forme %1 n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty shape.</source>
+      <translation>Forme vide sélectionnée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: selected shape has the wrong type.</source>
+      <translation>La forme sélectionnée est du mauvais type.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>Les objets principaux ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "tool_objects" is not initialized.</source>
+      <translation>Les objets outils ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty selection.</source>
+      <translation>Erreur : sélection vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty attribute selection.</source>
+      <translation>Erreur : sélection d&apos;attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty selection context.</source>
+      <translation>Erreur : contexte de sélection vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty feature.</source>
+      <translation>Erreur : fonctionnalité vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: %1 shape is not allowed for selection.</source>
+      <translation>La forme %1 n&apos;est pas autorisée pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: empty shape.</source>
+      <translation>Erreur : forme vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: Local selection not allowed.</source>
+      <translation>Sélection locale non autorisée.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Intersection:main_objects:GeomValidators_IntersectionSelection</name>
+    <message>
+      <source>Error: selected shape has the wrong type.</source>
+      <translation>La forme sélectionnée est du mauvais type.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "placement_end_shape" is not initialized.</source>
+      <translation>La forme du placement final n&apos;est pas définie.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_end_shape:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one shape in placement_end_shape and placement_start_shape attributes.</source>
+      <translation>Les formes de placement de début et de fin sont les mêmes.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "placement_objects_list" is not initialized.</source>
+      <translation>Les objets à placer ne sont pas sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_objects_list:FeaturesPlugin_ValidatorTransform</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_objects_list:FeaturesPlugin_ValidatorTransform</name>
+    <message>
+      <source>Objects from the %1 group can be selected in the %2 document, but an objects from the %3 group is selected.</source>
+      <translation>Les objets du groupe %1 peuvent être sélectionnés dans le document %2, mais un objet du groupe %3 est sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "placement_start_shape" is not initialized.</source>
+      <translation>La forme de départ n&apos;est pas définie.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "angle" is not initialized.</source>
+      <translation>L&apos;angle n&apos;est pas défini.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de rotation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de rotation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Les objets sélectionnés contiennent un élément avec un type de forme non autorisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de rotation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;axe de rotation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;axe de rotation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "main_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de rotation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "angle" is not initialized.</source>
+      <translation>L&apos;angle n&apos;est pas défini.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:main_objects:FeaturesPlugin_ValidatorTransform</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:main_objects:FeaturesPlugin_ValidatorTransform</name>
+    <message>
+      <source>Objects from the %1 group can be selected in the %2 document, but an objects from the %3 group is selected.</source>
+      <translation>Les objets du groupe %1 peuvent être sélectionnés dans le document %2, mais un objet du groupe %3 est sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "axis_object" is not initialized.</source>
+      <translation>L&apos;axe de translation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;axe de translation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Il ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Il fait référence à un attribut vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is \"%1\", it should be \"%2\"</source>
+      <translation>Le type de forme est &quot;%1&quot;, il devrait être &quot;%2&quot;.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;axe de translation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;axe de translation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;axe de translation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:main_objects:FeaturesPlugin_ValidatorTransform</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:main_objects:FeaturesPlugin_ValidatorTransform</name>
+    <message>
+      <source>Objects from the %1 group can be selected in the %2 document, but an objects from the %3 group is selected.</source>
+      <translation>Les objets du groupe %1 peuvent être sélectionnés dans le document %2, mais un objet du groupe %3 est sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:FeaturesPlugin_ValidatorUnionArguments</name>
+    <message>
+      <source>Error: Could not get \"%1\" attribute.</source>
+      <translation>Impossible d&apos;obtenir l&apos;attribut &quot; %1&quot;.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:FeaturesPlugin_ValidatorUnionArguments</name>
+    <message>
+      <source>Error: Not all shapes have shared topology.</source>
+      <translation>La topologie n&apos;est pas partagée par toutes les formes.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_objects" is not initialized.</source>
+      <translation>Objets non sélectionnés.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:base_objects:FeaturesPlugin_ValidatorUnionSelection</name>
+    <message>
+      <source>Error: This validator can only work with selection list in \"%1\" feature.</source>
+      <translation>Erreur : ce validateur ne peut fonctionner qu&apos;avec la liste de sélection dans la fonctionnalité \"%1\".</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:base_objects:FeaturesPlugin_ValidatorUnionSelection</name>
+    <message>
+      <source>Error: Whole compsolids not allowed for selection.</source>
+      <translation>Solides composites entiers non autorisés pour la sélection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Wrong number of arguments (expected 2): selection list id and min number of objects</source>
+      <translation>Erreur : Nombre d&apos;arguments incorrect (2 attendus): id de la liste de sélection et nombre minimal d&apos;objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>Union:GeomValidators_MinObjectsSelected</name>
+    <message>
+      <source>Error: Could not get attribute \"%1\".</source>
+      <translation>Erreur : impossible d&apos;obtenir l&apos;attribut \"%1\".</translation>
+    </message>
+  </context>
+  <context>
+    <name>FusionFaces:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "base_shape" is not initialized.</source>
+      <translation>La forme de base n&apos;est pas sélectionnée.</translation>
+    </message>
+  </context>
+
+  <!-- Part menu -->
+
+  <!-- AngularCopy -->
+  <context>
+    <name>AngularCopy</name>
+    <message>
+      <source>Angular Copy</source>
+      <translation>Copie angulaire</translation>
+    </message>
+    <message>
+      <source>Perform copy and rotate</source>
+      <translation>Effectuer une copie et une rotation</translation>
+    </message>
+  </context>
+  <context>
+    <name>AngularCopy:axis_angular</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for the axis of rotation</source>
+      <translation>Sélectionnez une arête pour l&apos;axe de rotation</translation>
+    </message>
+  </context>
+  <context>
+    <name>AngularCopy:axis_angular:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>AngularCopy:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>AngularCopy:nb_angular</name>
+    <message>
+      <source>Nb copies</source>
+      <translation>Nb copies</translation>
+    </message>
+    <message>
+      <source>Number of copies for the angular copy</source>
+      <translation>Nombre de copies pour la copie angulaire</translation>
+    </message>
+  </context>
+  <context>
+    <name>AngularCopy:step_angular</name>
+    <message>
+      <source>Angular step</source>
+      <translation>Pas angulaire</translation>
+    </message>
+    <message>
+      <source>Step for the angular direction</source>
+      <translation>Pas pour la direction angulaire</translation>
+    </message>
+  </context>
+
+  <!-- LinearCopy -->
+  <context>
+    <name>LinearCopy</name>
+    <message>
+      <source>Linear copy</source>
+      <translation>Copie linéaire</translation>
+    </message>
+    <message>
+      <source>Perform copy and translate</source>
+      <translation>Effectuer la copie et la translation</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:axis_first_dir</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for the first direction</source>
+      <translation>Sélectionnez une arête pour la première direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:axis_first_dir:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:axis_second_dir</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for the second direction</source>
+      <translation>Sélectionnez une arête pour la deuxième direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:nb_first_dir</name>
+    <message>
+      <source>Nb copies</source>
+      <translation>Nb copies</translation>
+    </message>
+    <message>
+      <source>Number of copies for the first direction</source>
+      <translation>Nombre de copies pour la première direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:nb_second_dir</name>
+    <message>
+      <source>Nb copies</source>
+      <translation>Nb copies</translation>
+    </message>
+    <message>
+      <source>Number of copies for the second direction</source>
+      <translation>Nombre de copies pour la deuxième direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:step_first_dir</name>
+    <message>
+      <source>Step</source>
+      <translation>Étape</translation>
+    </message>
+    <message>
+      <source>Step for the first direction</source>
+      <translation>Pas pour la première direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:step_second_dir</name>
+    <message>
+      <source>Step</source>
+      <translation>Étape</translation>
+    </message>
+    <message>
+      <source>Step for the second direction</source>
+      <translation>Pas pour la deuxième direction</translation>
+    </message>
+  </context>
+  <context>
+    <name>LinearCopy:use_second_dir</name>
+    <message>
+      <source>Second direction</source>
+      <translation>Deuxième direction</translation>
+    </message>
+  </context>
+
+  <!-- Measurement -->
+  <context>
+    <name>Measurement</name>
+    <message>
+      <source>Calculate properties of objects</source>
+      <translation>Calculer les propriétés des objets</translation>
+    </message>
+    <message>
+      <source>Measurement</source>
+      <translation>Mesure</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:MeasureKind</name>
+    <message>
+      <source>Angle between edges</source>
+      <translation>Angle entre les bords</translation>
+    </message>
+    <message>
+      <source>Angle by 3 points</source>
+      <translation>Angle de 3 points</translation>
+    </message>
+    <message>
+      <source>Distance between objects</source>
+      <translation>Distance entre objets</translation>
+    </message>
+    <message>
+      <source>Edge length</source>
+      <translation>Longueur de bord</translation>
+    </message>
+    <message>
+      <source>Radius of circular edge, cylindrical surface or sphere</source>
+      <translation>Rayon du bord circulaire, de la surface cylindrique ou de la sphère</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_from</name>
+    <message>
+      <source>First edge</source>
+      <translation>Premier bord</translation>
+    </message>
+    <message>
+      <source>Select an edge</source>
+      <translation>Sélectionnez une arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_from:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_point_1</name>
+    <message>
+      <source>Select a point</source>
+      <translation>Sélectionnez un point</translation>
+    </message>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_point_1:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_point_2</name>
+    <message>
+      <source>Angle apex</source>
+      <translation>Sommet de l’angle</translation>
+    </message>
+    <message>
+      <source>Select a point</source>
+      <translation>Sélectionnez un point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_point_2:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_point_3</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+    <message>
+      <source>Select a point</source>
+      <translation>Sélectionnez un point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_point_3:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_to</name>
+    <message>
+      <source>Second edge</source>
+      <translation>Deuxième bord</translation>
+    </message>
+    <message>
+      <source>Select an edge</source>
+      <translation>Sélectionnez une arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:angle_to:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:circular</name>
+    <message>
+      <source>Object</source>
+      <translation>Objet</translation>
+    </message>
+    <message>
+      <source>Select an edge or face</source>
+      <translation>Sélectionnez une arête ou une face</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:distance_from</name>
+    <message>
+      <source>From</source>
+      <translation>De</translation>
+    </message>
+    <message>
+      <source>Select a shape</source>
+      <translation>Sélectionnez une forme</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:distance_to</name>
+    <message>
+      <source>Select a shape</source>
+      <translation>Sélectionnez une forme</translation>
+    </message>
+    <message>
+      <source>To</source>
+      <translation>À</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:edge_for_length</name>
+    <message>
+      <source>Edge</source>
+      <translation>Bord</translation>
+    </message>
+    <message>
+      <source>Select an edge</source>
+      <translation>Sélectionnez une arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>Measurement:edge_for_length:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+
+  <!-- Placement -->
+  <context>
+    <name>Placement</name>
+    <message>
+      <source>Place objects relatively to another one</source>
+      <translation>Placez les objets l&apos;un par rapport à l&apos;autre</translation>
+    </message>
+    <message>
+      <source>Placement</source>
+      <translation>Placement</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_centering</name>
+    <message>
+      <source>Center faces under placement</source>
+      <translation>Faces centrales en cours de placement</translation>
+    </message>
+    <message>
+      <source>Centering</source>
+      <translation>Centrage</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_end_shape</name>
+    <message>
+      <source>Select an end face, edge or vertex</source>
+      <translation>Sélectionnez une extrémité, une arête ou un sommet</translation>
+    </message>
+    <message>
+      <source>Select an object</source>
+      <translation>Sélectionnez un objet</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_end_shape:GeomValidators_BodyShapes</name>
+    <message>
+      <source>Error: Context is empty.</source>
+      <translation>Erreur : le contexte est vide.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_objects_list</name>
+    <message>
+      <source>Select objects</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+    <message>
+      <source>Select objects to move</source>
+      <translation>Sélectionnez les objets à déplacer</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_reverse_direction</name>
+    <message>
+      <source>Reverse</source>
+      <translation>Sens inverse</translation>
+    </message>
+    <message>
+      <source>Reverse placement direction</source>
+      <translation>Sens de placement inverse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_start_shape</name>
+    <message>
+      <source>Select a start face, edge or vertex</source>
+      <translation>Sélectionnez une face de début, une arête ou un sommet</translation>
+    </message>
+    <message>
+      <source>Select an object</source>
+      <translation>Sélectionnez un objet</translation>
+    </message>
+  </context>
+  <context>
+    <name>Placement:placement_start_shape:GeomValidators_BodyShapes</name>
+    <message>
+      <source>Error: Context is empty.</source>
+      <translation>Erreur : le contexte est vide.</translation>
+    </message>
+  </context>
+
+  <!-- Rotation -->
+  <context>
+    <name>Rotation</name>
+    <message>
+      <source>Perform rotation of objects around the axis to specified angle</source>
+      <translation>Effectuer une rotation des objets autour de l&apos;axe avec l&apos;angle spécifié</translation>
+    </message>
+    <message>
+      <source>Rotation</source>
+      <translation>Rotation</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:CreationMethod</name>
+    <message>
+      <source>By a center and two points</source>
+      <translation>Par un centre et deux points</translation>
+    </message>
+    <message>
+      <source>By an axis and an angle</source>
+      <translation>Par un axe et un angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:axis_object</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for axis</source>
+      <translation>Sélectionnez une arête pour l&apos;axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:center_point</name>
+    <message>
+      <source>Center point</source>
+      <translation>Point central</translation>
+    </message>
+    <message>
+      <source>Select a center point</source>
+      <translation>Sélectionnez un point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:center_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:end_point</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+    <message>
+      <source>Select an end point</source>
+      <translation>Sélectionnez un point d&apos;arrivée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:end_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select solid objects</source>
+      <translation>Sélectionner des objets solides</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:start_point</name>
+    <message>
+      <source>Select a starting point</source>
+      <translation>Sélectionnez un point de départ</translation>
+    </message>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>Rotation:start_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+
+  <!-- Symmetry -->
+  <context>
+    <name>Symmetry</name>
+    <message>
+      <source>Perform symmetry with respect to a point, an axis or a plane</source>
+      <translation>Effectuer une symétrie par rapport à un point, un axe ou un plan</translation>
+    </message>
+    <message>
+      <source>Symmetry</source>
+      <translation>Symétrie</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:CreationMethod</name>
+    <message>
+      <source>Axis reflection</source>
+      <translation>Axe de réflexion</translation>
+    </message>
+    <message>
+      <source>Plane reflection</source>
+      <translation>Réflexion plane</translation>
+    </message>
+    <message>
+      <source>Point reflection</source>
+      <translation>Point de réflexion</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:axis_object</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an axis</source>
+      <translation>Sélectionnez un axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:axis_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:keep_original</name>
+    <message>
+      <source>Do not remove original shape</source>
+      <translation>Ne pas enlever la forme originale</translation>
+    </message>
+    <message>
+      <source>Keep original result</source>
+      <translation>Conserver le résultat original</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select solid objects</source>
+      <translation>Sélectionner des objets solides</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:plane_object</name>
+    <message>
+      <source>Plane</source>
+      <translation>Plan</translation>
+    </message>
+    <message>
+      <source>Select a plane</source>
+      <translation>Sélectionnez un plan</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:point_object</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+    <message>
+      <source>Select a point</source>
+      <translation>Sélectionnez un point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Symmetry:point_object:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+
+  <!-- Translation -->
+  <context>
+    <name>Translation</name>
+    <message>
+      <source>Perform translation of objects along the axis to specified distance</source>
+      <translation>Effectuer la translation des objets le long de l&apos;axe à la distance spécifiée</translation>
+    </message>
+    <message>
+      <source>Translation</source>
+      <translation>Translation</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:CreationMethod</name>
+    <message>
+      <source>By X, Y and Z dimensions</source>
+      <translation>Par dimensions X, Y et Z</translation>
+    </message>
+    <message>
+      <source>By an axis and a distance</source>
+      <translation>Par un axe et une distance</translation>
+    </message>
+    <message>
+      <source>By two points</source>
+      <translation>Par deux points</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:axis_object</name>
+    <message>
+      <source>Axis</source>
+      <translation>Axe</translation>
+    </message>
+    <message>
+      <source>Select an edge for axis</source>
+      <translation>Sélectionnez une arête pour l&apos;axe</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;axe de translation n&apos;est pas sélectionné.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:distance</name>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:dx</name>
+    <message>
+      <source>DX</source>
+      <translation>DX</translation>
+    </message>
+    <message>
+      <source>Dimension in X</source>
+      <translation>Dimension en X</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:dy</name>
+    <message>
+      <source>DY</source>
+      <translation>DY</translation>
+    </message>
+    <message>
+      <source>Dimension in Y</source>
+      <translation>Dimension en Y</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:dz</name>
+    <message>
+      <source>DZ</source>
+      <translation>DZ</translation>
+    </message>
+    <message>
+      <source>Dimension in Z</source>
+      <translation>Dimension en Z</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:end_point</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+    <message>
+      <source>Select the end point to define the axis</source>
+      <translation>Sélectionnez le point final pour définir l&apos;axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:end_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:main_objects</name>
+    <message>
+      <source>Main objects</source>
+      <translation>Objets principaux</translation>
+    </message>
+    <message>
+      <source>Select solid objects</source>
+      <translation>Sélectionner des objets solides</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:start_point</name>
+    <message>
+      <source>Select the start point to define the axis</source>
+      <translation>Sélectionnez le point de départ pour définir l&apos;axe</translation>
+    </message>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>Translation:start_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+
+</TS>
diff --git a/src/FeaturesPlugin/Test/TestExtrusionCut_ThroughAll.py b/src/FeaturesPlugin/Test/TestExtrusionCut_ThroughAll.py
new file mode 100644 (file)
index 0000000..ce66b25
--- /dev/null
@@ -0,0 +1,71 @@
+# Copyright (C) 2018-2019  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
+#
+
+from salome.shaper import model
+from GeomAPI import *
+
+import math
+
+def checkMiddlePoint(shape, x, y, z, tolerance = 1.e-7):
+    assert(shape is not None)
+    middlePoint = shape.middlePoint()
+    assert(math.fabs(middlePoint.x() - x) < tolerance), "{} != {}".format(middlePoint.x(), x)
+    assert(math.fabs(middlePoint.y() - y) < tolerance), "{} != {}".format(middlePoint.y(), y)
+    assert(math.fabs(middlePoint.z() - z) < tolerance), "{} != {}".format(middlePoint.z(), z)
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+Axis_1 = model.addAxis(Part_1_doc, 0, -10, 10)
+
+ExtrusionCut_1 = model.addExtrusionCut(Part_1_doc, [], model.selection(), [model.selection("SOLID", "Box_1_1")])
+Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Box_1_1/Left"))
+SketchProjection_1 = Sketch_1.addProjection(model.selection("EDGE", "[Box_1_1/Left][Box_1_1/Top]"), False)
+SketchLine_1 = SketchProjection_1.createdFeature()
+SketchCircle_1 = Sketch_1.addCircle(5, 10, 2)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.result(), SketchCircle_1.center())
+ExtrusionCut_1.setNestedSketch(Sketch_1)
+model.do()
+Shape = ExtrusionCut_1.results()[0].resultSubShapePair()[0].shape()
+checkMiddlePoint(Shape, 5.0, 5.0, 4.97049495)
+
+ExtrusionCut_1.setDirection(model.selection("EDGE", "Axis_1"))
+model.do()
+Shape = ExtrusionCut_1.results()[0].resultSubShapePair()[0].shape()
+checkMiddlePoint(Shape, 4.99796028, 5.00196717, 4.97487226)
+
+ExtrusionCut_2 = model.addExtrusionCut(Part_1_doc, [], [model.selection("SOLID", "ExtrusionCut_1_1")])
+Sketch_2 = model.addSketch(Part_1_doc, model.selection("FACE", "Box_1_1/Front"))
+SketchCircle_2 = Sketch_2.addCircle(2, 7, 1.5)
+ExtrusionCut_2.setNestedSketch(Sketch_2)
+model.do()
+
+ExtrusionCut_3 = model.addExtrusionCut(Part_1_doc, [], [model.selection("SOLID", "ExtrusionCut_2_1")])
+Sketch_3 = model.addSketch(Part_1_doc, model.selection("FACE", "ExtrusionCut_2_1/Modified_Face&Box_1_1/Front"))
+SketchCircle_3 = Sketch_3.addCircle(7, 2, 1.5)
+ExtrusionCut_3.setNestedSketch(Sketch_3)
+model.do()
+Shape = ExtrusionCut_3.results()[0].resultSubShapePair()[0].shape()
+checkMiddlePoint(Shape, 4.99787246, 4.92218515, 4.91081244)
+
+model.end()
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestExtrusionFuse_ThroughAll.py b/src/FeaturesPlugin/Test/TestExtrusionFuse_ThroughAll.py
new file mode 100644 (file)
index 0000000..e84a50b
--- /dev/null
@@ -0,0 +1,56 @@
+# Copyright (C) 2018-2019  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
+#
+
+from salome.shaper import model
+from GeomAPI import *
+
+import math
+
+def checkMiddlePoint(shape, x, y, z, tolerance = 1.e-7):
+    assert(shape is not None)
+    middlePoint = shape.middlePoint()
+    assert(math.fabs(middlePoint.x() - x) < tolerance), "{} != {}".format(middlePoint.x(), x)
+    assert(math.fabs(middlePoint.y() - y) < tolerance), "{} != {}".format(middlePoint.y(), y)
+    assert(math.fabs(middlePoint.z() - z) < tolerance), "{} != {}".format(middlePoint.z(), z)
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+Box_2 = model.addBox(Part_1_doc, 10, 10, 10)
+Box_3 = model.addBox(Part_1_doc, 20, 20, 20)
+Translation_1 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_2_1")], 20, 10, 0)
+Translation_2 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_3_1")], 40, 20, 0)
+Edge_1 = model.addEdge(Part_1_doc, model.selection("VERTEX", "[Box_1_1/Back][Box_1_1/Left][Box_1_1/Bottom]"), model.selection("VERTEX", "[Translation_2_1/MF:Translated&Box_3_1/Front][Translation_2_1/MF:Translated&Box_3_1/Right][Translation_2_1/MF:Translated&Box_3_1/Top]"))
+Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Box_1_1/Back"))
+SketchCircle_1 = Sketch_1.addCircle(2.134236344973221, -2.430731739079631, 1.564909384334321)
+model.do()
+Face_1 = model.addFace(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchCircle_1_2r")])
+ExtrusionFuse_1_objects_2 = [model.selection("SOLID", "Box_1_1"), model.selection("SOLID", "Translation_1_1"), model.selection("SOLID", "Translation_2_1")]
+ExtrusionFuse_1 = model.addExtrusionFuse(Part_1_doc, [model.selection("FACE", "Face_1_1")], model.selection("EDGE", "Edge_1_1"), ExtrusionFuse_1_objects_2)
+
+model.do()
+Shape = ExtrusionFuse_1.results()[0].resultSubShapePair()[0].shape()
+checkMiddlePoint(Shape, 37.46245068, 23.05267081, 8.52187757)
+
+model.end()
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestRevolutionCut_ThroughAll.py b/src/FeaturesPlugin/Test/TestRevolutionCut_ThroughAll.py
new file mode 100644 (file)
index 0000000..837f0a4
--- /dev/null
@@ -0,0 +1,60 @@
+# Copyright (C) 2018-2019  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
+#
+
+from salome.shaper import model
+
+import math
+
+def checkMiddlePoint(shape, x, y, z, tolerance = 1.e-7):
+    assert(shape is not None)
+    middlePoint = shape.middlePoint()
+    assert(math.fabs(middlePoint.x() - x) < tolerance), "{} != {}".format(middlePoint.x(), x)
+    assert(math.fabs(middlePoint.y() - y) < tolerance), "{} != {}".format(middlePoint.y(), y)
+    assert(math.fabs(middlePoint.z() - z) < tolerance), "{} != {}".format(middlePoint.z(), z)
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+Cylinder_1 = model.addCylinder(Part_1_doc, model.selection("VERTEX", "PartSet/Origin"), model.selection("EDGE", "PartSet/OZ"), 2, 10)
+Translation_1 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Cylinder_1_1")], 5, 5, 0)
+
+RevolutionCut_1 = model.addRevolutionCut(Part_1_doc, [], model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Top]"), [model.selection("SOLID", "Box_1_1")])
+
+Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Translation_1_1/MF:Translated&Cylinder_1_1/Face_2"))
+SketchProjection_1 = Sketch_1.addProjection(model.selection("VERTEX", "[Translation_1_1/MF:Translated&Cylinder_1_1/Face_1][Translation_1_1/MF:Translated&Cylinder_1_1/Face_2]__cc"), False)
+SketchPoint_1 = SketchProjection_1.createdFeature()
+SketchProjection_2 = Sketch_1.addProjection(model.selection("EDGE", "[Translation_1_1/MF:Translated&Cylinder_1_1/Face_1][Translation_1_1/MF:Translated&Cylinder_1_1/Face_2]"), False)
+SketchCircle_1 = SketchProjection_2.createdFeature()
+SketchCircle_2 = Sketch_1.addCircle(5, 5, 2)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchPoint_1.result(), SketchCircle_2.center())
+SketchConstraintTangent_1 = Sketch_1.setTangent(SketchCircle_1.results()[1], SketchCircle_2.results()[1])
+
+RevolutionCut_1.setNestedSketch(Sketch_1)
+
+model.do()
+
+Shape = RevolutionCut_1.results()[0].resultSubShapePair()[0].shape()
+checkMiddlePoint(Shape, 5.13562827, 5.0, 5.13562827)
+
+model.end()
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/Test/TestRevolutionFuse_ThroughAll.py b/src/FeaturesPlugin/Test/TestRevolutionFuse_ThroughAll.py
new file mode 100644 (file)
index 0000000..2f1d342
--- /dev/null
@@ -0,0 +1,60 @@
+# Copyright (C) 2018-2019  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
+#
+
+from salome.shaper import model
+
+import math
+
+def checkMiddlePoint(shape, x, y, z, tolerance = 1.e-7):
+    assert(shape is not None)
+    middlePoint = shape.middlePoint()
+    assert(math.fabs(middlePoint.x() - x) < tolerance), "{} != {}".format(middlePoint.x(), x)
+    assert(math.fabs(middlePoint.y() - y) < tolerance), "{} != {}".format(middlePoint.y(), y)
+    assert(math.fabs(middlePoint.z() - z) < tolerance), "{} != {}".format(middlePoint.z(), z)
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+Cylinder_1 = model.addCylinder(Part_1_doc, model.selection("VERTEX", "PartSet/Origin"), model.selection("EDGE", "PartSet/OZ"), 2, 10)
+Translation_1 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Cylinder_1_1")], 5, 5, 0)
+
+RevolutionFuse_1 = model.addRevolutionFuse(Part_1_doc, [], model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Top]"), [model.selection("SOLID", "Box_1_1")])
+
+Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Translation_1_1/MF:Translated&Cylinder_1_1/Face_2"))
+SketchProjection_1 = Sketch_1.addProjection(model.selection("VERTEX", "[Translation_1_1/MF:Translated&Cylinder_1_1/Face_1][Translation_1_1/MF:Translated&Cylinder_1_1/Face_2]__cc"), False)
+SketchPoint_1 = SketchProjection_1.createdFeature()
+SketchProjection_2 = Sketch_1.addProjection(model.selection("EDGE", "[Translation_1_1/MF:Translated&Cylinder_1_1/Face_1][Translation_1_1/MF:Translated&Cylinder_1_1/Face_2]"), False)
+SketchCircle_1 = SketchProjection_2.createdFeature()
+SketchCircle_2 = Sketch_1.addCircle(5, 5, 2)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchPoint_1.result(), SketchCircle_2.center())
+SketchConstraintTangent_1 = Sketch_1.setTangent(SketchCircle_1.results()[1], SketchCircle_2.results()[1])
+
+RevolutionFuse_1.setNestedSketch(Sketch_1)
+
+model.do()
+
+Shape = RevolutionFuse_1.results()[0].resultSubShapePair()[0].shape()
+checkMiddlePoint(Shape, 7.01705635, 5.0, 7.01705635)
+
+model.end()
+
+assert(model.checkPythonDump())
diff --git a/src/FeaturesPlugin/doc/TUI_extrusionCutThroughAll.rst b/src/FeaturesPlugin/doc/TUI_extrusionCutThroughAll.rst
new file mode 100644 (file)
index 0000000..c5ff730
--- /dev/null
@@ -0,0 +1,12 @@
+
+  .. _tui_create_extrusion_cut_through_all:
+
+Create Extrusion Cut through all objects
+========================================
+
+.. literalinclude:: examples/extrusion_cut_through_all.py 
+    :linenos:
+    :language: python
+
+:download:`Download this script <examples/extrusion_cut_through_all.py>`
+   
diff --git a/src/FeaturesPlugin/doc/TUI_extrusionFuseThroughAll.rst b/src/FeaturesPlugin/doc/TUI_extrusionFuseThroughAll.rst
new file mode 100644 (file)
index 0000000..a65ce34
--- /dev/null
@@ -0,0 +1,12 @@
+
+  .. _tui_create_extrusion_fuse_through_all:
+
+Create Extrusion Fuse through all objects
+========================================
+
+.. literalinclude:: examples/extrusion_fuse_through_all.py 
+    :linenos:
+    :language: python
+
+:download:`Download this script <examples/extrusion_fuse_through_all.py>`
+   
diff --git a/src/FeaturesPlugin/doc/TUI_revolutionCutThroughAll.rst b/src/FeaturesPlugin/doc/TUI_revolutionCutThroughAll.rst
new file mode 100644 (file)
index 0000000..b7e158e
--- /dev/null
@@ -0,0 +1,12 @@
+
+  .. _tui_create_revolution_cut_through_all:
+
+Create Revolution Cut by 360 degrees
+====================================
+
+.. literalinclude:: examples/revolution_cut_through_all.py 
+    :linenos:
+    :language: python
+
+:download:`Download this script <examples/revolution_cut_through_all.py>`
+   
diff --git a/src/FeaturesPlugin/doc/TUI_revolutionFuseThroughAll.rst b/src/FeaturesPlugin/doc/TUI_revolutionFuseThroughAll.rst
new file mode 100644 (file)
index 0000000..047d25d
--- /dev/null
@@ -0,0 +1,12 @@
+
+  .. _tui_create_revolution_fuse_through_all:
+
+Create Revolution Fuse by 360 degrees
+=====================================
+
+.. literalinclude:: examples/revolution_fuse_through_all.py 
+    :linenos:
+    :language: python
+
+:download:`Download this script <examples/revolution_fuse_through_all.py>`
+   
diff --git a/src/FeaturesPlugin/doc/examples/extrusion_cut_through_all.py b/src/FeaturesPlugin/doc/examples/extrusion_cut_through_all.py
new file mode 100644 (file)
index 0000000..d9f380b
--- /dev/null
@@ -0,0 +1,17 @@
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+ExtrusionCut_1 = model.addExtrusionCut(Part_1_doc,
+                                       [],
+                                       model.selection(),
+                                       [model.selection("SOLID", "Box_1_1")])
+Sketch_1 = model.addSketch(Part_1_doc,
+                           model.selection("FACE", "Box_1_1/Top"))
+SketchCircle_1 = Sketch_1.addCircle(5, 0, 2)
+ExtrusionCut_1.setNestedSketch(Sketch_1)
+model.do()
+model.end()
diff --git a/src/FeaturesPlugin/doc/examples/extrusion_fuse_through_all.py b/src/FeaturesPlugin/doc/examples/extrusion_fuse_through_all.py
new file mode 100644 (file)
index 0000000..f64d433
--- /dev/null
@@ -0,0 +1,36 @@
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+
+# Objects to be cut
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+Box_2 = model.addBox(Part_1_doc, 10, 10, 10)
+Box_3 = model.addBox(Part_1_doc, 20, 20, 20)
+Translation_1 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_2_1")], 20, 10, 0)
+Translation_2 = model.addTranslation(Part_1_doc, [model.selection("SOLID", "Box_3_1")], 40, 20, 0)
+ExtrusionFuse_1_objects_2 = [model.selection("SOLID", "Box_1_1"),
+                             model.selection("SOLID", "Translation_1_1"),
+                             model.selection("SOLID", "Translation_2_1")]
+
+# Extrusion direction
+Point_1 = model.addPoint(Part_1_doc, 0, 0, 0)
+Point_2 = model.addPoint(Part_1_doc, 60, 40, 20)
+Edge_1 = model.addEdge(Part_1_doc, model.selection("VERTEX", "Point_1"), model.selection("VERTEX", "Point_2"))
+
+# Base object for extrusion
+Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Box_1_1/Back"))
+SketchCircle_1 = Sketch_1.addCircle(2.13, -2.43, 1.6)
+model.do()
+Face_1 = model.addFace(Part_1_doc, [model.selection("FACE", "Sketch_1/Face-SketchCircle_1_2r")])
+
+# Extrusion fuse through all
+ExtrusionFuse_1 = model.addExtrusionFuse(Part_1_doc,
+                                         [model.selection("FACE", "Face_1_1")],
+                                         model.selection("EDGE", "Edge_1_1"),
+                                         ExtrusionFuse_1_objects_2)
+
+model.do()
+model.end()
diff --git a/src/FeaturesPlugin/doc/examples/revolution_cut_through_all.py b/src/FeaturesPlugin/doc/examples/revolution_cut_through_all.py
new file mode 100644 (file)
index 0000000..508147e
--- /dev/null
@@ -0,0 +1,13 @@
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Box_1_1/Top"))
+SketchCircle_1 = Sketch_1.addCircle(5, 5, 2.5)
+model.do()
+RevolutionCut_1 = model.addRevolutionCut(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")], model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Top]"), [model.selection("SOLID", "Box_1_1")])
+model.do()
+model.end()
diff --git a/src/FeaturesPlugin/doc/examples/revolution_fuse_through_all.py b/src/FeaturesPlugin/doc/examples/revolution_fuse_through_all.py
new file mode 100644 (file)
index 0000000..fad51a6
--- /dev/null
@@ -0,0 +1,13 @@
+from salome.shaper import model
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Box_1 = model.addBox(Part_1_doc, 10, 10, 10)
+Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Box_1_1/Top"))
+SketchCircle_1 = Sketch_1.addCircle(5, 5, 2.5)
+model.do()
+RevolutionFuse_1 = model.addRevolutionFuse(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")], model.selection("EDGE", "[Box_1_1/Front][Box_1_1/Top]"), [model.selection("SOLID", "Box_1_1")])
+model.do()
+model.end()
index ca3499c2cbb63382f402fb81c647fbd5f0b45817..fb6a4dee4127118616897bb4653b224fb1b61449 100644 (file)
@@ -18,7 +18,7 @@ The following property panel will be opened:
 .. centered::
   Start sketch
 
-There are two variants of the property panel for Extrusion Cut depending on the chosen option:
+There are three variants of the property panel for Extrusion Cut depending on the chosen option:
 
 .. image:: images/extrusion_by_sizes.png
    :align: left
@@ -28,6 +28,10 @@ There are two variants of the property panel for Extrusion Cut depending on the
    :align: left
 **By Bounding Planes** extrudes objects by specifying bounding planes and offsets.
 
+.. image:: images/extrusion_through_all.png
+   :align: left
+**Through All** extrudes base objects through all objects to be cut.
+
 
 By sizes
 --------
@@ -42,7 +46,7 @@ By sizes
 - **Axis** - if selected, it will be the direction of extrusion, otherwise objects normals will be used.
 - **To size**  - size for extrusion in the direction.
 - **From size** - size for extrusion in the opposite direction.
-- **Cut from** - contains a list of objects which will be cut from the result of extrusion.
+- **Cut from** - contains a list of objects to be cut by the result of extrusion.
 
 **TUI Commands**:  
 
@@ -110,7 +114,7 @@ By bounding planes
 - **To offset** - offset for extrusion or for a bounding plane, if selected.
 - **From plane** - a planar face can be selected to bound extrusion from the other side.
 - **From offset** - offset for extrusion or for a bounding plane, if selected.
-- **Cut from** - contains a list of objects which will be cut from the result of extrusion.
+- **Cut from** - contains a list of objects which will be cut by the result of extrusion.
 
 **TUI Commands**:
 
@@ -149,3 +153,46 @@ The Result of the operation will be an extruded shape:
    **Created Extrusion Cut**
 
 **See Also** a sample TUI Script of :ref:`tui_create_extrusion_cut_by_bounding_planes` operation.
+
+Through all
+-----------
+
+.. image:: images/ExtrusionCut3.png
+  :align: center
+
+.. centered::
+  Extrusion Cut: definition through all objects
+
+- **Base objects** - contains a list of objects selected in the Object Browser or in the Viewer, which will be extruded.
+- **Axis** - if selected, it will be the direction of extrusion, otherwise objects normals will be used.
+- **Cut from** - contains a list of objects to be cut by the result of extrusion.
+
+**TUI Commands**:  
+
+.. py:function:: model.addExtrusionCut(part, objectsToExtrude, objectsToCut)
+
+    :param part: The current part object.
+    :param list: A list of objects for extrusion.
+    :param list: A list of objects to cut from.
+    :return: Created object.
+
+.. py:function:: model.addExtrusionCut(part, objects, direction, objectsToCut)
+
+    :param part: The current part object.
+    :param list: A list of objects for extrusion.
+    :param object: A direction of extrusion
+    :param list: A list of objects to cut from.
+    :return: Created object.
+
+Result
+""""""
+
+The Result of the operation will be an extruded shape:
+
+.. image:: images/extrusion_cut_through_all_result.png
+          :align: center
+
+.. centered::
+   **Created Extrusion Cut**
+
+**See Also** a sample TUI Script of :ref:`tui_create_extrusion_cut_through_all` operation.
index 65d971a871b21f82f4358dd120fbcacf9c3ad18c..59d49043e4fb252d961d51e94d3a7bbc0a64a045 100644 (file)
@@ -18,7 +18,7 @@ The following property panel will be opened:
 .. centered::
   Start sketch
 
-There are two variants of the property panel for Extrusion Fuse depending on the chosen option:
+There are three variants of the property panel for Extrusion Fuse depending on the chosen option:
 
 .. image:: images/extrusion_by_sizes.png
    :align: left
@@ -28,6 +28,10 @@ There are two variants of the property panel for Extrusion Fuse depending on the
    :align: left
 **By Bounding Planes** extrudes objects by specifying bounding planes and offsets.
 
+.. image:: images/extrusion_through_all.png
+   :align: left
+**Through All** extrudes base objects to pass through all objects fuse with.
+
 
 By sizes
 --------
@@ -149,3 +153,46 @@ The Result of the operation will be an extruded shape:
    **Extrusion Fuse created**
 
 **See Also** a sample TUI Script of :ref:`tui_create_extrusion_fuse_by_bounding_planes` operation.
+
+Through all
+-----------
+
+.. image:: images/ExtrusionFuse3.png
+  :align: center
+
+.. centered::
+  Extrusion Fuse: definition through all objects
+
+- **Base objects** - contains a list of objects selected in the Object Browser or in the Viewer, which will be extruded.
+- **Axis** - if selected, it will be the direction of extrusion, otherwise objects normals will be used.
+- **Fuse with** - contains a list of objects which will be fused with the result of extrusion.
+
+**TUI Commands**:
+
+.. py:function:: model.addExtrusionFuse(part, objectsToExtrude, objectsToFuse)
+
+    :param part: The current part object.
+    :param list: A list of objects for extrusion.
+    :param list: A list of objects to fuse with.
+    :return: Created object.
+
+.. py:function:: model.addExtrusionFuse(part, objectsToExtrude, direction, objectsToFuse)
+
+    :param part: The current part object.
+    :param list: A list of objects for extrusion.
+    :param object: A direction of extrusion
+    :param list: A list of objects to fuse with.
+    :return: Created object.
+
+Result
+""""""
+
+The Result of the operation will be an extruded shape:
+
+.. image:: images/extrusion_fuse_through_all_result.png
+          :align: center
+
+.. centered::
+   **Extrusion Fuse created**
+
+**See Also** a sample TUI Script of :ref:`tui_create_extrusion_fuse_through_all` operation.
index bb5d5f05454086fea481ffdf2a9f75d9f077c0e6..0370f02e705e6f9a9f18fe5c1a6832c8201dd7eb 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/ExtrusionCut1.png and b/src/FeaturesPlugin/doc/images/ExtrusionCut1.png differ
index 348f12c0f66a556a0b1f37b814787c2c9bc77c12..cb725f5507e6a125ec0dd211e2f40432b4c00ccc 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/ExtrusionCut2.png and b/src/FeaturesPlugin/doc/images/ExtrusionCut2.png differ
diff --git a/src/FeaturesPlugin/doc/images/ExtrusionCut3.png b/src/FeaturesPlugin/doc/images/ExtrusionCut3.png
new file mode 100644 (file)
index 0000000..8f1388d
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/ExtrusionCut3.png differ
index 33c2445f872f8e284734c7a66d00503ffc884a16..8cb3cd9652570abe47bb406c6a00b5d20d2f203f 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/ExtrusionFuse1.png and b/src/FeaturesPlugin/doc/images/ExtrusionFuse1.png differ
index f38e71c162cf067d0fe41ba0c01aabed64578c37..62e4559ae0167c02472b85daa919ccffbcb220aa 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/ExtrusionFuse2.png and b/src/FeaturesPlugin/doc/images/ExtrusionFuse2.png differ
diff --git a/src/FeaturesPlugin/doc/images/ExtrusionFuse3.png b/src/FeaturesPlugin/doc/images/ExtrusionFuse3.png
new file mode 100644 (file)
index 0000000..a3fdd99
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/ExtrusionFuse3.png differ
index 8c7a2885ab7b1972802567b1ff30b806b77bfc97..e97241e7716210237d9b3dba9a12dab73e1a0b5a 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/RevolutionCut1.png and b/src/FeaturesPlugin/doc/images/RevolutionCut1.png differ
index 5cdf5d832b91c8e67126731af5ba5776a8fd7095..fd8889bfaf841978fb8c833641a5a9fc93379947 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/RevolutionCut2.png and b/src/FeaturesPlugin/doc/images/RevolutionCut2.png differ
diff --git a/src/FeaturesPlugin/doc/images/RevolutionCut3.png b/src/FeaturesPlugin/doc/images/RevolutionCut3.png
new file mode 100644 (file)
index 0000000..d2de5bb
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/RevolutionCut3.png differ
index 600d78e685d8586b752f280ea9e5a13a7ae6639c..bd074071e5f519536956d2bcedbb24271421c50e 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/RevolutionFuse1.png and b/src/FeaturesPlugin/doc/images/RevolutionFuse1.png differ
index 87fc70918afd448e7f03bb82f49f095dbe498801..1316c378d8c57353889885e849678dbed3c201f3 100644 (file)
Binary files a/src/FeaturesPlugin/doc/images/RevolutionFuse2.png and b/src/FeaturesPlugin/doc/images/RevolutionFuse2.png differ
diff --git a/src/FeaturesPlugin/doc/images/RevolutionFuse3.png b/src/FeaturesPlugin/doc/images/RevolutionFuse3.png
new file mode 100644 (file)
index 0000000..eef253a
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/RevolutionFuse3.png differ
diff --git a/src/FeaturesPlugin/doc/images/extrusion_cut_through_all_result.png b/src/FeaturesPlugin/doc/images/extrusion_cut_through_all_result.png
new file mode 100644 (file)
index 0000000..99c1b8d
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/extrusion_cut_through_all_result.png differ
diff --git a/src/FeaturesPlugin/doc/images/extrusion_fuse_through_all_result.png b/src/FeaturesPlugin/doc/images/extrusion_fuse_through_all_result.png
new file mode 100644 (file)
index 0000000..d043450
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/extrusion_fuse_through_all_result.png differ
diff --git a/src/FeaturesPlugin/doc/images/extrusion_through_all.png b/src/FeaturesPlugin/doc/images/extrusion_through_all.png
new file mode 100644 (file)
index 0000000..6ecb152
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/extrusion_through_all.png differ
diff --git a/src/FeaturesPlugin/doc/images/revolution_cut_through_all_result.png b/src/FeaturesPlugin/doc/images/revolution_cut_through_all_result.png
new file mode 100644 (file)
index 0000000..6905721
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/revolution_cut_through_all_result.png differ
diff --git a/src/FeaturesPlugin/doc/images/revolution_fuse_through_all_result.png b/src/FeaturesPlugin/doc/images/revolution_fuse_through_all_result.png
new file mode 100644 (file)
index 0000000..f1f549d
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/revolution_fuse_through_all_result.png differ
diff --git a/src/FeaturesPlugin/doc/images/revolution_through_all.png b/src/FeaturesPlugin/doc/images/revolution_through_all.png
new file mode 100644 (file)
index 0000000..3c75206
Binary files /dev/null and b/src/FeaturesPlugin/doc/images/revolution_through_all.png differ
index b2f5d47049c71a3a9992e50010785e1608d8692e..da86d155e6db03adfa7c873c61f2e51c2764aadd 100644 (file)
@@ -18,7 +18,7 @@ The following property panel will be opened:
 .. centered::
   Start sketch
 
-There are two variants of the property panel for Revolution Cut depending on the chosen option:
+There are three variants of the property panel for Revolution Cut depending on the chosen option:
 
 .. image:: images/revolution_by_angles.png
    :align: left
@@ -28,6 +28,10 @@ There are two variants of the property panel for Revolution Cut depending on the
    :align: left
 **By Bounding Planes** revolves objects by specifying bounding planes and angles.
 
+.. image:: images/revolution_through_all.png
+   :align: left
+**Through All** revolves objects by 360 degrees.
+
 
 By angles
 --------
@@ -120,4 +124,40 @@ The Result of the operation will be a revolved shape:
 .. centered::
    **Revolution Cut created**
 
-**See Also** a sample TUI Script of :ref:`tui_create_revolution_cut_by_bounding_planes` operation.
\ No newline at end of file
+**See Also** a sample TUI Script of :ref:`tui_create_revolution_cut_by_bounding_planes` operation.
+
+Through all
+--------
+
+.. image:: images/RevolutionCut3.png
+  :align: center
+
+.. centered::
+  Revolution Cut: revolving through all the space
+
+- **Base objects** - contains a list of objects selected in the Object Browser or in the Viewer, which will be revolved.
+- **Axis** - axis of revolution.
+- **Cut from** - contains a list of objects which will but cut with the result of revolution.
+
+**TUI Commands**:
+
+.. py:function:: model.addRevolutionCut(part, objectsToRevolve, axis, objectToCut)
+
+    :param part: The current part object.
+    :param list: A list of objects for revolution.
+    :param object: An axis.
+    :param list: A list of objects to cut from.
+    :return: Created object.
+
+Result
+""""""
+
+The Result of the operation will be a revolved shape:
+
+.. image:: images/revolution_cut_through_all_result.png
+          :align: center
+
+.. centered::
+   **Revolution Cut created**
+
+**See Also** a sample TUI Script of :ref:`tui_create_revolution_cut_through_all` operation.
index 3ef022a8affefe51ddbc04687c35ff20d73e6160..a608a03d9c735a0686f84bcfbeba86c5e274c4a7 100644 (file)
@@ -18,7 +18,7 @@ The following property panel will be opened:
 .. centered::
   Start sketch
   
-There are two variants of the property panel for Revolution Fuse depending on the chosen option:
+There are three variants of the property panel for Revolution Fuse depending on the chosen option:
 
 .. image:: images/revolution_by_angles.png
    :align: left
@@ -28,6 +28,10 @@ There are two variants of the property panel for Revolution Fuse depending on th
    :align: left
 **By Bounding Planes** revolves objects by specifying bounding planes and angles.
 
+.. image:: images/revolution_through_all.png
+   :align: left
+**Through All** revolves objects by 360 degrees.
+
 
 By angles
 --------
@@ -120,4 +124,40 @@ The Result of the operation will be a revolved shape:
 .. centered::
    **Revolution Fuse created**
 
-**See Also** a sample TUI Script of :ref:`tui_create_revolution_fuse_by_bounding_planes` operation.
\ No newline at end of file
+**See Also** a sample TUI Script of :ref:`tui_create_revolution_fuse_by_bounding_planes` operation.
+
+Through All
+-----------
+
+.. image:: images/RevolutionFuse3.png
+  :align: center
+
+.. centered::
+  Revolution Fuse: definition by bounding planes
+
+- **Base objects** - contains a list of objects selected in the Object Browser or in the Viewer, which will be revolved.
+- **Axis** - axis of revolution.
+- **Fuse with** - contains a list of objects which will be fused with the result of revolution.
+
+**TUI Command**:
+
+.. py:function:: model.addRevolutionFuse(part, objectsToRevolve, axis, objectToFuse)
+
+    :param part: The current part object.
+    :param list: A list of objects for revolution.
+    :param object: An axis.
+    :param list: A list of objects to fuse with.
+    :return: Created object.
+
+Result
+""""""
+
+The Result of the operation will be a revolved shape:
+
+.. image:: images/revolution_fuse_through_all_result.png
+          :align: center
+
+.. centered::
+   **Revolution Fuse created**
+
+**See Also** a sample TUI Script of :ref:`tui_create_revolution_fuse_through_all` operation.
index c8561193e7c5879980a62224f52b4d6385c44cf7..bbbf73dd86acfdb799be51dc52b2ae2f5c7d63d4 100644 (file)
@@ -83,6 +83,8 @@
           </doublevalue>
         </groupbox>
       </box>
+      <box id="ThroughAll" title="Through all" icon="icons/Features/extrusion_throughall_32x32.png">
+      </box>
     </toolbox>
   </groupbox>
   <multi_selector id="main_objects"
index b0c18a5c4d981744eb6f254aadf17ea394058c08..5e9d7355698c63a689089848627233e0230331e6 100644 (file)
@@ -83,6 +83,8 @@
           </doublevalue>
         </groupbox>
       </box>
+      <box id="ThroughAll" title="Through all" icon="icons/Features/extrusion_throughall_32x32.png">
+      </box>
     </toolbox>
   </groupbox>
   <multi_selector id="main_objects"
diff --git a/src/FeaturesPlugin/icons/extrusion_throughall_32x32.png b/src/FeaturesPlugin/icons/extrusion_throughall_32x32.png
new file mode 100644 (file)
index 0000000..6ecb152
Binary files /dev/null and b/src/FeaturesPlugin/icons/extrusion_throughall_32x32.png differ
diff --git a/src/FeaturesPlugin/icons/revol_throughall_32x32.png b/src/FeaturesPlugin/icons/revol_throughall_32x32.png
new file mode 100644 (file)
index 0000000..3c75206
Binary files /dev/null and b/src/FeaturesPlugin/icons/revol_throughall_32x32.png differ
index a8edd4a49206d282d77dc588b79e750d28886f82..c3b19383ebd73881dece0904956dd2bf9836b6dc 100644 (file)
@@ -83,6 +83,8 @@
           </doublevalue>
         </groupbox>
       </box>
+      <box id="ThroughAll" title="Through all" icon="icons/Features/revol_throughall_32x32.png">
+      </box>
     </toolbox>
   </groupbox>
   <multi_selector id="main_objects"
index 7981db76c305aa9751236ff148d9d11e0d4c5e66..4f571406e089f1fac9229e8c0348802124fa2443 100644 (file)
@@ -83,6 +83,8 @@
           </doublevalue>
         </groupbox>
       </box>
+      <box id="ThroughAll" title="Through all" icon="icons/Features/revol_throughall_32x32.png">
+      </box>
     </toolbox>
   </groupbox>
   <multi_selector id="main_objects"
index 235851975d320db4ffd4596b5215e1af2ee011b9..5861ac8d81332276b0175babe5bcc5af6ad7910a 100644 (file)
@@ -33,6 +33,7 @@ SET(PROJECT_HEADERS
     GeomAlgoAPI_Prism.h
     GeomAlgoAPI_Revolution.h
     GeomAlgoAPI_Boolean.h
+    GeomAlgoAPI_ThroughAll.h
     GeomAlgoAPI_Rotation.h
     GeomAlgoAPI_Translation.h
     GeomAlgoAPI_MakeShape.h
@@ -81,6 +82,7 @@ SET(PROJECT_HEADERS
     GeomAlgoAPI_Offset.h
     GeomAlgoAPI_SolidClassifier.h
     GeomAlgoAPI_MapShapesAndAncestors.h
+    GeomAlgoAPI_Projection.h
     GeomAlgoAPI_Chamfer.h
 )
 
@@ -94,6 +96,7 @@ SET(PROJECT_SOURCES
     GeomAlgoAPI_Prism.cpp
     GeomAlgoAPI_Revolution.cpp
     GeomAlgoAPI_Boolean.cpp
+    GeomAlgoAPI_ThroughAll.cpp
     GeomAlgoAPI_Rotation.cpp
     GeomAlgoAPI_Translation.cpp
     GeomAlgoAPI_MakeShape.cpp
index 32224162bc0d10a1d38f0f3571be27ded0212f2e..1b07fabae681eb16649c8339cbc421c83683972a 100644 (file)
@@ -51,7 +51,7 @@ public:
 
   /// Redefinition of the generic method for the Fuse problem: OCCT 30481
   GEOMALGOAPI_EXPORT virtual void modified(const GeomShapePtr theOldShape,
-    ListOfShape& theNewShapes);
+                                           ListOfShape& theNewShapes);
 
 private:
   /// Builds resulting shape.
index d1d3abe8b5317f5b03ee1e892e3e19c53f65b07f..71426779d1f35c582a94a430a84aaaee21f300c5 100644 (file)
 #include <GeomAPI_Wire.h>
 
 #include <Bnd_Box.hxx>
+
+#include <BRep_Tool.hxx>
 #include <BRep_Builder.hxx>
-#include <BRepAdaptor_Curve.hxx>
 #include <BRepAlgo.hxx>
 #include <BRepAlgo_FaceRestrictor.hxx>
+#include <BRepAdaptor_Curve.hxx>
 #include <BRepBndLib.hxx>
 #include <BRepBuilderAPI_FindPlane.hxx>
 #include <BRepBuilderAPI_MakeEdge.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
 #include <BRepCheck_Analyzer.hxx>
 #include <BRepExtrema_DistShapeShape.hxx>
 #include <BRepExtrema_ExtCF.hxx>
 #include <BRepTools_WireExplorer.hxx>
 #include <BRepTopAdaptor_FClass2d.hxx>
 #include <BRepClass_FaceClassifier.hxx>
+#include <BRepLib_CheckCurveOnSurface.hxx>
+
+#include <BOPAlgo_Builder.hxx>
+
 #include <Geom2d_Curve.hxx>
 #include <Geom2d_Curve.hxx>
-#include <BRepLib_CheckCurveOnSurface.hxx>
-#include <BRep_Tool.hxx>
-#include  <Geom_CylindricalSurface.hxx>
+
+#include <Geom_CylindricalSurface.hxx>
 #include <Geom_Line.hxx>
 #include <Geom_Plane.hxx>
+#include <Geom_RectangularTrimmedSurface.hxx>
+
 #include <GeomAPI_ProjectPointOnCurve.hxx>
 #include <GeomAPI_ShapeIterator.h>
+
 #include <GeomLib_IsPlanarSurface.hxx>
 #include <GeomLib_Tool.hxx>
 #include <GeomAPI_IntCS.hxx>
+
 #include <gp_Pln.hxx>
 #include <GProp_GProps.hxx>
+
 #include <IntAna_IntConicQuad.hxx>
 #include <IntAna_Quadric.hxx>
-#include <NCollection_Vector.hxx>
+
 #include <ShapeAnalysis.hxx>
 #include <ShapeAnalysis_Surface.hxx>
-#include <TopoDS_Builder.hxx>
+
+#include <TopoDS.hxx>
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Shell.hxx>
 #include <TopoDS_Vertex.hxx>
-#include <TopoDS.hxx>
+#include <TopoDS_Builder.hxx>
+
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
 
+#include <TopTools_ListIteratorOfListOfShape.hxx>
 
-#include <BOPAlgo_Builder.hxx>
-#include <BRepBuilderAPI_MakeVertex.hxx>
-#include <TopoDS_Edge.hxx>
+#include <NCollection_Vector.hxx>
 
 //==================================================================================================
 static GProp_GProps props(const TopoDS_Shape& theShape)
@@ -1076,6 +1087,7 @@ static TopoDS_Wire fixParametricGaps(const TopoDS_Wire& theWire)
   return aFixedWire;
 }
 
+//==================================================================================================
 std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_ShapeTools::wireToEdge(
       const std::shared_ptr<GeomAPI_Wire>& theWire)
 {
@@ -1094,6 +1106,7 @@ std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_ShapeTools::wireToEdge(
   return anEdge;
 }
 
+//==================================================================================================
 ListOfShape GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(const GeomShapePtr& theShape)
 {
   ListOfShape aSubShapes;
@@ -1114,4 +1127,123 @@ ListOfShape GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(const GeomShapePtr& the
   }
 
   return aSubShapes;
-}
\ No newline at end of file
+}
+
+//==================================================================================================
+static void getMinMaxPointsOnLine(const std::list<std::shared_ptr<GeomAPI_Pnt> >& thePoints,
+                                  const gp_Dir theDir,
+                                  double& theMin, double& theMax)
+{
+  theMin = RealLast();
+  theMax = RealFirst();
+  // Project bounding points on theDir
+  for (std::list<std::shared_ptr<GeomAPI_Pnt> >::const_iterator
+         aPointsIt = thePoints.begin(); aPointsIt != thePoints.end(); aPointsIt++) {
+    const gp_Pnt& aPnt = (*aPointsIt)->impl<gp_Pnt>();
+    gp_Dir aPntDir (aPnt.XYZ());
+    Standard_Real proj = (theDir*aPntDir) * aPnt.XYZ().Modulus();
+    if (proj < theMin) theMin = proj;
+    if (proj > theMax) theMax = proj;
+  }
+}
+
+//==================================================================================================
+void GeomAlgoAPI_ShapeTools::computeThroughAll(const ListOfShape& theObjects,
+                                               const ListOfShape& theBaseShapes,
+                                               const std::shared_ptr<GeomAPI_Dir> theDir,
+                                               double& theToSize, double& theFromSize)
+{
+  // Bounding box of objects
+  std::list<std::shared_ptr<GeomAPI_Pnt> > aBndObjs = GeomAlgoAPI_ShapeTools::getBoundingBox(theObjects);
+  if (aBndObjs.size() != 8) {
+    return;
+  }
+
+  // Prism direction
+  if (theDir.get()) {
+    // One direction for all prisms
+    gp_Dir aDir = theDir->impl<gp_Dir>();
+
+    // Bounding box of the base
+    std::list<std::shared_ptr<GeomAPI_Pnt> > aBndBases = GeomAlgoAPI_ShapeTools::getBoundingBox(theBaseShapes);
+    if (aBndBases.size() != 8) {
+      return;
+    }
+
+    // Objects bounds
+    Standard_Real lowBnd, upperBnd;
+    getMinMaxPointsOnLine(aBndObjs, aDir, lowBnd, upperBnd);
+
+    // Base bounds
+    Standard_Real lowBase, upperBase;
+    getMinMaxPointsOnLine(aBndBases, aDir, lowBase, upperBase);
+
+    // ----------.-----.---------.--------------.-----------> theDir
+    //       lowBnd   lowBase   upperBase    upperBnd
+
+    theToSize = upperBnd - lowBase;
+    theFromSize = upperBase - lowBnd;
+  } else {
+    // Direction is a normal to each base shape (different normals to bases)
+    // So we calculate own sizes for each base shape
+    theToSize = 0.0;
+    theFromSize = 0.0;
+
+    for (ListOfShape::const_iterator anIt = theBaseShapes.begin(); anIt != theBaseShapes.end(); ++anIt) {
+      const GeomShapePtr& aBaseShape_i = (*anIt);
+      ListOfShape aBaseShapes_i;
+      aBaseShapes_i.push_back(aBaseShape_i);
+
+      // Bounding box of the base
+      std::list<std::shared_ptr<GeomAPI_Pnt> > aBndBases = GeomAlgoAPI_ShapeTools::getBoundingBox(aBaseShapes_i);
+      if (aBndBases.size() != 8) {
+        return;
+      }
+
+      // Direction (normal to aBaseShapes_i)
+      // Code like in GeomAlgoAPI_Prism
+      gp_Dir aDir;
+      const TopoDS_Shape& aBaseShape = aBaseShape_i->impl<TopoDS_Shape>();
+      BRepBuilderAPI_FindPlane aFindPlane(aBaseShape);
+      if (aFindPlane.Found() == Standard_True) {
+        Handle(Geom_Plane) aPlane;
+        if (aBaseShape.ShapeType() == TopAbs_FACE || aBaseShape.ShapeType() == TopAbs_SHELL) {
+          TopExp_Explorer anExp(aBaseShape, TopAbs_FACE);
+          const TopoDS_Shape& aFace = anExp.Current();
+          Handle(Geom_Surface) aSurface = BRep_Tool::Surface(TopoDS::Face(aFace));
+          if(aSurface->DynamicType() == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
+            Handle(Geom_RectangularTrimmedSurface) aTrimSurface =
+              Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface);
+            aSurface = aTrimSurface->BasisSurface();
+          }
+          if(aSurface->DynamicType() != STANDARD_TYPE(Geom_Plane)) {
+            return;
+          }
+          aPlane = Handle(Geom_Plane)::DownCast(aSurface);
+        } else {
+          aPlane = aFindPlane.Plane();
+        }
+        aDir = aPlane->Axis().Direction();
+      } else {
+        return;
+      }
+
+      // Objects bounds
+      Standard_Real lowBnd, upperBnd;
+      getMinMaxPointsOnLine(aBndObjs, aDir, lowBnd, upperBnd);
+
+      // Base bounds
+      Standard_Real lowBase, upperBase;
+      getMinMaxPointsOnLine(aBndBases, aDir, lowBase, upperBase);
+
+      // ----------.-----.---------.--------------.-----------> theDir
+      //       lowBnd   lowBase   upperBase    upperBnd
+
+      double aToSize_i = upperBnd - lowBase;
+      double aFromSize_i = upperBase - lowBnd;
+
+      if (aToSize_i > theToSize) theToSize = aToSize_i;
+      if (aFromSize_i > theFromSize) theFromSize = aFromSize_i;
+    }
+  }
+}
index da415d359c49cbfbe56e0b1e082e0016dceae297..49b3432445b394744ae06d5faa901f6dde0dc01f 100644 (file)
@@ -193,6 +193,17 @@ public:
   /// \param[in] theShape shape that should be exploded
   /// \return list of sub-shapes (vertices, edges, faces, solids)
   GEOMALGOAPI_EXPORT static ListOfShape getLowLevelSubShapes(const GeomShapePtr& theShape);
+
+  /// \brief Calculate prism sizes to ensure that it passes through all objects
+  /// \param[in] theObjects objects to be joined/cutted by the prism
+  /// \param[in] theBaseShapes bases of the prism
+  /// \param[in] theDir direction of the prism
+  /// \param[out] theToSize upper offset of the prism
+  /// \param[out] theFromSize lower offset of the prism
+  GEOMALGOAPI_EXPORT static void computeThroughAll(const ListOfShape& theObjects,
+                                                   const ListOfShape& theBaseShapes,
+                                                   const std::shared_ptr<GeomAPI_Dir> theDir,
+                                                   double& theToSize, double& theFromSize);
 };
 
 #endif
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ThroughAll.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ThroughAll.cpp
new file mode 100644 (file)
index 0000000..f64ef60
--- /dev/null
@@ -0,0 +1,88 @@
+// Copyright (C) 2014-2019  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
+//
+
+#include "GeomAlgoAPI_ThroughAll.h"
+
+#include <GeomAlgoAPI_Boolean.h>
+#include <GeomAlgoAPI_ShapeTools.h>
+
+#include <BRep_Builder.hxx>
+#include <BOPAlgo_BOP.hxx>
+#include <TopTools_ListOfShape.hxx>
+#include <TopoDS_Compound.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <TopExp_Explorer.hxx>
+
+//=================================================================================================
+GeomAlgoAPI_ThroughAll::GeomAlgoAPI_ThroughAll(std::shared_ptr<GeomAlgoAPI_Prism> thePrismAlgo,
+                                               const ListOfShape& theObjects)
+: GeomAlgoAPI_Boolean(thePrismAlgo->shape(), theObjects, GeomAlgoAPI_Tools::BOOL_CUT)
+{
+  removeEnds(thePrismAlgo);
+}
+
+//=================================================================================================
+void GeomAlgoAPI_ThroughAll::removeEnds(std::shared_ptr<GeomAlgoAPI_Prism> thePrismAlgo)
+{
+  GeomShapePtr aCuttedTool = shape(); // result of BOP Cut (thePrismAlgo->shape() by theObjects)
+
+  // Simplify the result
+  ListOfShape aPieces = GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(aCuttedTool);
+
+  // Get end shapes of Prism
+  const ListOfShape& fromShapes = thePrismAlgo->fromShapes();
+  const ListOfShape& toShapes = thePrismAlgo->toShapes();
+  ListOfShape endShapes (fromShapes);
+  endShapes.insert(endShapes.end(), toShapes.begin(), toShapes.end());
+
+  // Throw away end pieces of cutted tools (containing endShapes)
+  TopTools_ListOfShape listTools;
+  for (ListOfShape::const_iterator
+         anIt = aPieces.begin(); anIt != aPieces.end(); anIt++) {
+    TopoDS_Shape aPiece = (*anIt)->impl<TopoDS_Shape>();
+    bool endPiece = false;
+
+    for (ListOfShape::const_iterator aBaseIt = endShapes.begin();
+         aBaseIt != endShapes.end() && !endPiece; aBaseIt++) {
+      // Check, if the piece contains aBase (one of endShapes)
+      TopoDS_Shape aBase = (*aBaseIt)->impl<TopoDS_Shape>();
+      TopExp_Explorer anExp (aPiece, aBase.ShapeType());
+      for (; anExp.More() && !endPiece; anExp.Next()) {
+        if (anExp.Current().IsSame(aBase))
+          endPiece = true;
+      }
+    }
+
+    if (!endPiece) {
+      listTools.Append(aPiece);
+    }
+  }
+
+  BRep_Builder aBuilder;
+  TopoDS_Compound aCompound;
+  aBuilder.MakeCompound(aCompound);
+  for (TopTools_ListOfShape::Iterator anIt(listTools); anIt.More(); anIt.Next()) {
+    aBuilder.Add(aCompound, anIt.Value());
+  }
+
+  std::shared_ptr<GeomAPI_Shape> aShape (new GeomAPI_Shape());
+  aShape->setImpl(new TopoDS_Shape(aCompound));
+  this->setShape(aShape);
+  this->setDone(true);
+}
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ThroughAll.h b/src/GeomAlgoAPI/GeomAlgoAPI_ThroughAll.h
new file mode 100644 (file)
index 0000000..bd54dd7
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright (C) 2014-2019  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
+//
+
+#ifndef GeomAlgoAPI_ThroughAll_H_
+#define GeomAlgoAPI_ThroughAll_H_
+
+#include <GeomAlgoAPI.h>
+#include <GeomAlgoAPI_Boolean.h>
+#include <GeomAlgoAPI_Prism.h>
+//#include <GeomAlgoAPI_Tools.h>
+
+#include <GeomAPI_Shape.h>
+
+/// \class GeomAlgoAPI_ThroughAll
+/// \ingroup DataAlgo
+/// \brief Cuts a prism by all given objects, throw away end pieces
+class GeomAlgoAPI_ThroughAll : public GeomAlgoAPI_Boolean
+{
+public:
+
+  /// Constructor.
+  GEOMALGOAPI_EXPORT GeomAlgoAPI_ThroughAll (std::shared_ptr<GeomAlgoAPI_Prism> thePrismAlgo,
+                                             const ListOfShape& theObjects);
+
+private:
+  /// Builds resulting shape.
+  void removeEnds (std::shared_ptr<GeomAlgoAPI_Prism> thePrismAlgo);
+};
+
+#endif
index fa7830d936d05df07be7ede37672a10b26c245c1..ecc087c26d2dfbc9722f0fbc67ecb5d0e8fd2b28 100644 (file)
@@ -41,6 +41,7 @@ SET(PROJECT_LIBRARIES
 
 INCLUDE_DIRECTORIES(
   ../GeomAPI        # only for SWIG
+  ../Events         # only for SWIG
   ../ModelAPI
 )
 
index df13808e459934ca4cd9946a2f4a2d5442492a43..b23de60169fc52bbaff275f51837ed215f67d7c8 100644 (file)
@@ -22,6 +22,7 @@
 
   #include <GeomAPI_swig.h>
   #include <ModelAPI_swig.h>
+  #include <Events_MessageGroup.h>
 
   #include "GeomDataAPI.h"
   #include "GeomDataAPI_Point.h"
index 411a1a21ef59acb0b5a9dd70aa43e1778fda1887..3a52d2d515d992becc252e778487441bd5346a41 100644 (file)
@@ -52,6 +52,7 @@ bool GeomValidators_ZeroOffset::isValid(const std::shared_ptr<ModelAPI_Feature>&
   if(theFeature->string(*anIt)) {
     aSelectedMethod = theFeature->string(*anIt)->value();
   }
+  if (aSelectedMethod == "ThroughAll") return true;
   anIt++;
   std::string aCreationMethod = *anIt;
   anIt++;
index 3ee99ee6af12816746d0d9833473e54c1333b34b..f933ad261408582eeb7b93f71b5267056377737a 100644 (file)
@@ -43,36 +43,41 @@ int Model_AttributeIntArray::size()
   return (myArray.IsNull() || !myArray->IsValid()) ? 0 : myArray->Length();
 }
 
-void Model_AttributeIntArray::setSize(const int theSize)
+void Model_AttributeIntArray::setSize(const int theSize, bool sendUpdated)
 {
   if (myArray.IsNull() || !myArray->IsValid()) { // create array if it is not done yet
     if (theSize != 0) { // if size is zero, nothing to do (null array means there is no array)
       myArray = TDataStd_IntegerArray::Set(myLab, 0, theSize - 1);
-      owner()->data()->sendAttributeUpdated(this);
+      if (sendUpdated)
+        owner()->data()->sendAttributeUpdated(this);
     }
   } else { // reset the old array
     if (theSize) {
       if (theSize != myArray->Length()) { // old data is not kept, a new array is created
         Handle(TColStd_HArray1OfInteger) aNewArray = new TColStd_HArray1OfInteger(0, theSize - 1);
         myArray->ChangeArray(aNewArray);
-        owner()->data()->sendAttributeUpdated(this);
+        if (sendUpdated)
+          owner()->data()->sendAttributeUpdated(this);
       }
     } else { // size is zero => array must be erased
       if (!myArray.IsNull()) {
         myArray.Nullify();
         myLab.ForgetAttribute(TDataStd_IntegerArray::GetID());
-        owner()->data()->sendAttributeUpdated(this);
+        if (sendUpdated)
+          owner()->data()->sendAttributeUpdated(this);
       }
     }
   }
 }
 
 void Model_AttributeIntArray::setValue(const int theIndex,
-                                       const int theValue)
+                                       const int theValue,
+                                       bool sendUpdated)
 {
   if (myArray->Value(theIndex) != theValue) {
     myArray->SetValue(theIndex, theValue);
-    owner()->data()->sendAttributeUpdated(this);
+    if (sendUpdated)
+      owner()->data()->sendAttributeUpdated(this);
   }
 }
 
index 1243a14ceb9a6fda73f7baa576cfc2be2ed4a5c6..98040141e382df0fe83675cf12c6d6b661240e06 100644 (file)
@@ -47,11 +47,13 @@ class Model_AttributeIntArray : public ModelAPI_AttributeIntArray
   MODEL_EXPORT virtual int size();
 
   /// Sets the new size of the array. The previous data is erased.
-  MODEL_EXPORT virtual void setSize(const int theSize);
+  MODEL_EXPORT virtual void setSize(const int theSize,
+                                    bool sendUpdated = true);
 
   /// Defines the value of the array by index [0; size-1]
   MODEL_EXPORT virtual void setValue(const int theIndex,
-                                     const int theValue);
+                                     const int theValue,
+                                     bool sendUpdated = true);
 
   /// Returns the value by the index
   MODEL_EXPORT virtual int value(const int theIndex);
index 1ef43263f40abdae8a3f11daf77b0c21f49d7d9c..a1894001e694def50b1455874b06ddf7c73ec1db 100644 (file)
@@ -118,7 +118,7 @@ SET(PROJECT_LIBRARIES
     Config
     GeomAPI
 )
-SET(CMAKE_SWIG_FLAGS -threads -w325,321,362,383,302,403,473)
+SET(CMAKE_SWIG_FLAGS -threads -w325,321,362,383,302,403,451,473)
 ADD_DEFINITIONS(-DMODELAPI_EXPORTS)
 
 ADD_LIBRARY(ModelAPI SHARED ${PROJECT_SOURCES} ${PROJECT_HEADERS})
index dc76645c858400c27b191d35e251c9fc336ff224..913b41b8bebc172ab07dbef5f135e83ab0ed2b4d 100644 (file)
@@ -36,6 +36,7 @@
 
 // import other modules
 %import "GeomAPI.i"
+%import "Events.i"
 
 // to avoid error on this
 #define MODELAPI_EXPORT
@@ -96,6 +97,7 @@
 %shared_ptr(ModelAPI_ResultField)
 %shared_ptr(ModelAPI_ResultParameter)
 %shared_ptr(ModelAPI_ResultCompSolid)
+%shared_ptr(ModelAPI_ObjectUpdatedMessage)
 
 %typecheck(SWIG_TYPECHECK_POINTER) const ModelAPI_AttributeTables::Value {
   $1 = (PyFloat_Check($input) || PyLong_Check($input) || PyUnicode_Check($input) || PyBool_Check($input)) ? 1 : 0;
 
 // all supported interfaces
 %include "ModelAPI_Entity.h"
+%include "ModelAPI_Events.h"
 %include "ModelAPI_Document.h"
 %include "ModelAPI_Session.h"
 %include "ModelAPI_Plugin.h"
 // std::set -> []
 %template(AttributeSet) std::set<std::shared_ptr<ModelAPI_Attribute> >;
 %template(FeatureSet) std::set<std::shared_ptr<ModelAPI_Feature> >;
+%template(ObjectSet) std::set<std::shared_ptr<ModelAPI_Object> >;
 
 // std::dynamic_pointer_cast
 template<class T1, class T2> std::shared_ptr<T1> shared_ptr_cast(std::shared_ptr<T2> theObject);
@@ -192,6 +196,8 @@ template<class T1, class T2> std::shared_ptr<T1> shared_ptr_cast(std::shared_ptr
 %template(modelAPI_ResultGroup) shared_ptr_cast<ModelAPI_ResultGroup, ModelAPI_Result>;
 %template(modelAPI_ResultField) shared_ptr_cast<ModelAPI_ResultField, ModelAPI_Result>;
 
+%template(messageToUpdatedMessage) shared_ptr_cast<ModelAPI_ObjectUpdatedMessage, Events_Message>;
+
 // Attribute casts
 %template(modelAPI_AttributeDocRef)        shared_ptr_cast<ModelAPI_AttributeDocRef, ModelAPI_Attribute>;
 %template(modelAPI_AttributeDouble)        shared_ptr_cast<ModelAPI_AttributeDouble, ModelAPI_Attribute>;
index d0fd38c50a84dfc32a45b10039d34d1e3b4984d3..e77841875dce26527cf8dc59cff944b3b14f2675 100644 (file)
@@ -40,11 +40,13 @@ class ModelAPI_AttributeIntArray : public ModelAPI_Attribute
   MODELAPI_EXPORT virtual int size() = 0;
 
   /// Sets the new size of the array. The previous data is erased.
-  MODELAPI_EXPORT virtual void setSize(const int theSize) = 0;
+  MODELAPI_EXPORT virtual void setSize(const int theSize,
+                                       bool sendUpdated = true) = 0;
 
   /// Defines the value of the array by index [0; size-1]
   MODELAPI_EXPORT virtual void setValue(const int theIndex,
-                                         const int theValue) = 0;
+                                        const int theValue,
+                                        bool sendUpdated = true) = 0;
 
   /// Returns the value by the index
   MODELAPI_EXPORT virtual int value(const int theIndex) = 0;
index 042c06a41d040c82902eb7c1d3bfda56037e454f..0b250ebd53e24493c8f0b4b93e42841d71b53aa4 100644 (file)
@@ -101,6 +101,15 @@ static const char * EVENT_STABILITY_CHANGED = "StabilityChanged";
 /// Event ID that the sketch is prepared and all grouped messages for the solver may be flushed
 static const char * EVENT_SKETCH_PREPARED = "SketchPrepared";
 
+/// Event ID that provides a request for list of non-fixed objects necessary for DoF = 0
+static const char * EVENT_GET_DOF_OBJECTS = "GetDoFObjects";
+
+/// Event ID that provides a request for list of non-fixed objects necessary for DoF = 0
+static const char * EVENT_DOF_OBJECTS = "DoFObjects";
+
+/// Event ID that requests updates visual attributes for presentations
+static const char * EVENT_VISUAL_ATTRIBUTES = "UpdateVisualAttributes";
+
 /// Message that feature was changed (used for Object Browser update): moved, updated and deleted
 class MODELAPI_EXPORT ModelAPI_ObjectUpdatedMessage : public Events_MessageGroup
 {
index c6b8a6f7257df6ba4933747cb038402399502a87..728c009513157c5dc0a85f7d75be2e4d074a352a 100644 (file)
@@ -29,6 +29,7 @@
 #include <ModelAPI_ResultPart.h>
 #include <ModelAPI_AttributeDocRef.h>
 #include <ModelAPI_Validator.h>
+#include <ModelAPI_AttributeIntArray.h>
 #include <list>
 #include <map>
 #include <iostream>
@@ -784,4 +785,50 @@ void removeResults(const std::list<ResultPtr>& theResults)
   }
 }
 
+double getDeflection(const std::shared_ptr<ModelAPI_Result>& theResult)
+{
+  double aDeflection = -1;
+  // get deflection from the attribute of the result
+  if (theResult.get() != NULL &&
+    theResult->data()->attribute(ModelAPI_Result::DEFLECTION_ID()).get() != NULL) {
+    AttributeDoublePtr aDoubleAttr = theResult->data()->real(ModelAPI_Result::DEFLECTION_ID());
+    if (aDoubleAttr.get() && aDoubleAttr->isInitialized()) {
+      double aValue = aDoubleAttr->value();
+      if (aValue > 0) /// zero value should not be used as a deflection(previous studies)
+        aDeflection = aDoubleAttr->value();
+    }
+  }
+  return aDeflection;
+}
+
+
+void getColor(const std::shared_ptr<ModelAPI_Result>& theResult, std::vector<int>& theColor)
+{
+  theColor.clear();
+  // get color from the attribute of the result
+  if (theResult.get() != NULL &&
+    theResult->data()->attribute(ModelAPI_Result::COLOR_ID()).get() != NULL) {
+    AttributeIntArrayPtr aColorAttr = theResult->data()->intArray(ModelAPI_Result::COLOR_ID());
+    if (aColorAttr.get() && aColorAttr->size()) {
+      theColor.push_back(aColorAttr->value(0));
+      theColor.push_back(aColorAttr->value(1));
+      theColor.push_back(aColorAttr->value(2));
+    }
+  }
+}
+
+double getTransparency(const std::shared_ptr<ModelAPI_Result>& theResult)
+{
+  double aTransparency = -1;
+  // get transparency from the attribute of the result
+  if (theResult.get() != NULL &&
+    theResult->data()->attribute(ModelAPI_Result::TRANSPARENCY_ID()).get() != NULL) {
+    AttributeDoublePtr aDoubleAttr = theResult->data()->real(ModelAPI_Result::TRANSPARENCY_ID());
+    if (aDoubleAttr.get() && aDoubleAttr->isInitialized()) {
+      aTransparency = aDoubleAttr->value();
+    }
+  }
+  return aTransparency;
+}
+
 } // namespace ModelAPI_Tools
index 6b4d31f8401cdd34a2c1e8403833400ab37e7f09..83fbdb888b0b3cf2d2accda2296a09603b1172cb 100644 (file)
@@ -209,6 +209,26 @@ MODELAPI_EXPORT std::set<std::shared_ptr<ModelAPI_Feature> >
 /*! Creates a remove result features with the given results
 */
 MODELAPI_EXPORT void removeResults(const std::list<std::shared_ptr<ModelAPI_Result> >& theResults);
+
+/*! Returns current deflection in the given result
+* \param theResult a result object
+* \return a deflection value or -1 if it was not defined
+*/
+MODELAPI_EXPORT double getDeflection(const std::shared_ptr<ModelAPI_Result>& theResult);
+
+/*! Returns current color of the current result
+* \param[in] theResult a result object
+* \param[out] theColor a color values if it is defined
+*/
+MODELAPI_EXPORT void getColor(const std::shared_ptr<ModelAPI_Result>& theResult,
+  std::vector<int>& theColor);
+
+/*! Returns current transparency in the given result
+* \param theResult a result object
+* \return a transparency value or -1 if it was not defined
+*/
+MODELAPI_EXPORT double getTransparency(const std::shared_ptr<ModelAPI_Result>& theResult);
+
 }
 
 #endif
index 2187c2ae41cf1ca29cbb66a396da298566eec586..de4312c62408c486f42c0d6e4831818e82c0cfd0 100644 (file)
@@ -24,6 +24,7 @@
 
   #include "ModelAPI.h"
   #include "ModelAPI_Entity.h"
+  #include "ModelAPI_Events.h"
   #include "ModelAPI_Document.h"
   #include "ModelAPI_Session.h"
   #include "ModelAPI_Object.h"
index fe127695dd545764b0db4fc78ec1d351b1d8b041..1f6aca0631f2e7d36019e787f24c5efee4428da0 100644 (file)
@@ -231,7 +231,7 @@ SET(PROJECT_SOURCES
 )
 
 SET(TEXT_RESOURCES
-#    ModuleBase_msg_fr.ts
+    ModuleBase_msg_fr.ts
 )
 
 SET(PROJECT_LIBRARIES
@@ -261,7 +261,9 @@ IF (${UPDATE_TRANSLATION})
                            OPTIONS -extensions cpp -no-recursive
                           )
 ELSE(${UPDATE_TRANSLATION})
-    QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    IF(${MAKE_TRANSLATION})
+        QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    ENDIF(${MAKE_TRANSLATION})
 ENDIF(${UPDATE_TRANSLATION})
 
 SOURCE_GROUP ("Generated Files" FILES ${PROJECT_AUTOMOC} ${PROJECT_COMPILED_RESOURCES} ${QM_RESOURCES})
index 03abb8233950ce89c26d887b94dd8c5206dc5b36..f3314ca2a27a1c186a11c2d01a1f636ce6a3da29 100644 (file)
@@ -159,9 +159,9 @@ void ModuleBase_IModule::launchOperation(const QString& theCmdId,
   }
 }
 
-Handle(AIS_InteractiveObject) ModuleBase_IModule::createPresentation(const ObjectPtr& theResult)
+AISObjectPtr ModuleBase_IModule::createPresentation(const ObjectPtr& theResult)
 {
-  return Handle(AIS_InteractiveObject)();
+  return AISObjectPtr();
 }
 
 bool ModuleBase_IModule::canBeShaded(Handle(AIS_InteractiveObject) theAIS) const
@@ -186,13 +186,6 @@ ModuleBase_Operation* ModuleBase_IModule::getNewOperation(const std::string& the
   return new ModuleBase_OperationFeature(theFeatureId.c_str(), this);
 }
 
-bool ModuleBase_IModule::customizeObject(ObjectPtr theObject,
-                              const ModuleBase_IModule::ModuleBase_CustomizeFlag& theFlag,
-                              const bool theUpdateViewer)
-{
-  return false;
-}
-
 ModuleBase_Operation* ModuleBase_IModule::createOperation(const std::string& theFeatureId)
 {
   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
index b748d6a148c2721b89fd659551cc38cf50f11c82..d2ce9c4a9832a52b2b5c877268f49690a4b2ef24 100644 (file)
@@ -277,14 +277,14 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
                                    const bool theUpdateViewer) {}
 
   /// Modifies the given presentation in the custom way.
-  virtual bool customisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
-                                     AISObjectPtr thePrs,
-                                     GeomCustomPrsPtr theCustomPrs) { return false; };
+  //virtual bool customisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
+  //                                   AISObjectPtr thePrs,
+  //                                   GeomCustomPrsPtr theCustomPrs) { return false; };
 
-  /// Modifies the given presentation in the custom way after usual customize is performed.
-  virtual bool afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
-                                     AISObjectPtr thePrs,
-                                     GeomCustomPrsPtr theCustomPrs) { return false; };
+  ///// Modifies the given presentation in the custom way after usual customize is performed.
+  //virtual bool afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
+  //                                   AISObjectPtr thePrs,
+  //                                   GeomCustomPrsPtr theCustomPrs) { return false; };
 
   /// Update the object presentable properties such as color, lines width and other
   /// If the object is result with the color attribute value set, it is used,
@@ -294,8 +294,10 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   /// should be updated(e.g. only highlighted elements)
   /// \param theUpdateViewer the parameter whether the viewer should be update immediately
   /// \returns true if the object is modified
-  virtual bool customizeObject(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
-                               const bool theUpdateViewer);
+  virtual bool customizeFeature(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
+    const bool theUpdateViewer) {
+    return false;
+  }
 
   /// Disable displaying of custom mode
   /// \param theMode a mode to disable
@@ -312,10 +314,16 @@ class MODULEBASE_EXPORT ModuleBase_IModule : public QObject
   /// \param theCmdId the operation name
   virtual ModuleBase_Operation* createOperation(const std::string& theCmdId);
 
-  /// Create specific for the module presentation
+  /// Create specific for the module presentation. The presentation has to be
+  /// customized accordingly to the object.
   /// \param theResult an object for presentation
   /// \return created presentation or NULL(default value)
-  virtual Handle(AIS_InteractiveObject) createPresentation(const ObjectPtr& theResult);
+  virtual AISObjectPtr createPresentation(const ObjectPtr& theResult);
+
+  /// Customize presentation according to objects attributes
+  /// \param theObject an object for presentation
+  /// \param thePrs a presentation object
+  virtual void customizePresentation(const ObjectPtr& theObject, const AISObjectPtr& thePrs) const {}
 
   //! Returns data object by AIS
   virtual ObjectPtr findPresentedObject(const AISObjectPtr& theAIS) const = 0;
index 89546edfd4bacde2ac2f40b91a4258dbcef1a299..a563c277981ff7cf1ca87f8a0174cd535209eac2 100644 (file)
 
 //**************************************************************
 ModuleBase_ModelWidget::ModuleBase_ModelWidget(QWidget* theParent,
-                                               const Config_WidgetAPI* theData)
-    : QWidget(theParent),
-      myIsEditing(false),
-      myState(Stored),
-      myIsValueStateBlocked(false),
-      myFlushUpdateBlocked(false),
-      myWidgetValidator(0)
+  const Config_WidgetAPI* theData)
+  : QWidget(theParent),
+  myIsEditing(false),
+  myState(Stored),
+  myIsValueStateBlocked(false),
+  myFlushUpdateBlocked(false),
+  myWidgetValidator(0)
 {
 #ifdef DEBUG_WIDGET_INSTANCE
   qDebug("ModuleBase_ModelWidget::ModuleBase_ModelWidget");
@@ -68,6 +68,8 @@ ModuleBase_ModelWidget::ModuleBase_ModelWidget(QWidget* theParent,
 
   myIsModifiedInEdit = theData->getProperty(ATTR_MODIFIED_IN_EDIT);
 
+  myUpdateVisualAttributes = theData->getBooleanAttribute(ATTR_VISUAL_CHANGED, false);
+
   myDefaultValue = theData->getProperty(ATTR_DEFAULT);
   myUseReset = theData->getBooleanAttribute(ATTR_USE_RESET, true);
   myIsComputedDefault = theData->getProperty(ATTR_DEFAULT) == DOUBLE_WDG_DEFAULT_COMPUTED;
@@ -437,6 +439,10 @@ void ModuleBase_ModelWidget::updateObject(ObjectPtr theObject)
 #ifdef DEBUG_WIDGET_INSTANCE
     qDebug("ModuleBase_ModelWidget::updateObject");
 #endif
+    if (myFeature.get() && myUpdateVisualAttributes) {
+      static const Events_ID anEvent = Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES);
+      ModelAPI_EventCreator::get()->sendUpdated(myFeature, anEvent);
+    }
     ModuleBase_Tools::flushUpdated(theObject);
     emit objectUpdated();
   }
index fdd467481bf79cf5439a99b6b28834b411f507f2..4fb4ad55249d3381aa2c59a7acce5d79f9e6c9e3 100644 (file)
@@ -445,6 +445,8 @@ private:
   bool myIsValueStateBlocked;
   /// do not flush updated signal
   bool myFlushUpdateBlocked;
+
+  bool myUpdateVisualAttributes;
 };
 
 #endif
index 5055c0275ee8744e3b81c49f44a2f45524461a5c..a96e15ff07179c97dffa4719e96d4fd52423d30e 100644 (file)
@@ -763,6 +763,7 @@ void flushUpdated(ObjectPtr theObject)
   // (for the sketch result) to start processing of the sketch in the solver.
   // TODO: these flushes should be moved in a separate method provided by Model
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_CREATED));
+  Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES));
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
   Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_DELETED));
 
index 337aa8acf4a4e246ccb969bfc5470dd4057de76f..0d04aeeb05866ffe459b3236b464e9a3fa84980b 100644 (file)
@@ -411,7 +411,7 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList<ModuleBase_ViewerPrsPtr>
     theValues.append(anInvalidValues);
 
   if (isDone) // may be the feature's result is not displayed, but attributes should be
-    myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments,
+    myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments,
                              true);/// hope that something is redisplayed by object updated
 
   return isDone;
@@ -555,7 +555,7 @@ bool ModuleBase_WidgetMultiSelector::processDelete()
     myWorkshop->setSelected(getAttributeSelection());
 
     // may be the feature's result is not displayed, but attributes should be
-    myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments,
+    myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments,
                               true); /// hope that something is redisplayed by object updated
   }
 
@@ -618,7 +618,7 @@ void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()
   restoreValue();
   myWorkshop->setSelected(getAttributeSelection());
   // may be the feature's result is not displayed, but attributes should be
-  myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments,
+  myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments,
                             true); /// hope that something is redisplayed by object updated
   // clear history should follow after set selected to do not increase history by setSelected
   clearSelectedHistory();
@@ -855,8 +855,8 @@ void ModuleBase_WidgetMultiSelector::onDeleteItem()
 //********************************************************************
 void ModuleBase_WidgetMultiSelector::onListSelection()
 {
-  myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
-                                        true);
+  myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
+                                         true);
 }
 
 //********************************************************************
diff --git a/src/ModuleBase/ModuleBase_msg_fr.ts b/src/ModuleBase/ModuleBase_msg_fr.ts
new file mode 100644 (file)
index 0000000..cf7e5f7
--- /dev/null
@@ -0,0 +1,341 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+  <context>
+    <name>ExpressionEditor</name>
+    <message>
+      <location filename="ModuleBase_WidgetExprEditor.cpp" line="65"/>
+      <source>Ctrl+Space</source>
+      <comment>Complete</comment>
+      <translation>Ctrl+Espace</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_FilterItem</name>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="192"/>
+      <source>Reverse the filter</source>
+      <translation>Inverser le filtre</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="202"/>
+      <source>Delete the filter</source>
+      <translation>Supprimer le filtre</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_FilterStarter</name>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="95"/>
+      <source>Selection by filters</source>
+      <translation>Sélection par filtres</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_ListView</name>
+    <message>
+      <location filename="ModuleBase_ListView.cpp" line="45"/>
+      <source>Copy</source>
+      <translation>Copie</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_ListView.cpp" line="51"/>
+      <source>Delete</source>
+      <translation>Effacer</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_PreferencesDlg</name>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="251"/>
+      <source>Edit preferences</source>
+      <translation>Modifier les préférences</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="267"/>
+      <source>Default</source>
+      <translation>Défaut</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="285"/>
+      <source>Desktop</source>
+      <translation>Bureau</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="291"/>
+      <source>Module</source>
+      <translation>Module</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="300"/>
+      <source>Viewer</source>
+      <translation>Vue</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="303"/>
+      <source>Horizontal gradient</source>
+      <translation>Dégradé horizontal</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="303"/>
+      <source>Vertical gradient</source>
+      <translation>Gradient vertical</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="303"/>
+      <source>First diagonal gradient</source>
+      <translation>Premier gradient en diagonale</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="304"/>
+      <source>Second diagonal gradient</source>
+      <translation>Deuxième gradient diagonal</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="304"/>
+      <source>First corner gradient</source>
+      <translation>Premier angle de dégradé</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="305"/>
+      <source>Second corner gradient</source>
+      <translation>Deuxième angle du dégradé</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="305"/>
+      <source>Third corner gradient</source>
+      <translation>Troisième angle de dégradé</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="306"/>
+      <source>Fourth corner gradient</source>
+      <translation>Quatrième angle</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="312"/>
+      <source>Background</source>
+      <translation>Arrière-plan</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="316"/>
+      <source>Viewer 3d</source>
+      <translation>Vue 3d</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="328"/>
+      <source>Default selection</source>
+      <translation>Sélection par défaut</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="330"/>
+      <source>Faces</source>
+      <translation>Faces</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="333"/>
+      <source>Edges</source>
+      <translation>Arêtes</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="336"/>
+      <source>Vertices</source>
+      <translation>Sommets</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="340"/>
+      <source>Selection sensitivity</source>
+      <translation>Sensibilité de sélection</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="342"/>
+      <source>Vertex</source>
+      <translation>Sommet</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="344"/>
+      <source>Edge</source>
+      <translation>Bord</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="347"/>
+      <source>Additional highlighting</source>
+      <translation>Mise en évidence supplémentaire</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="349"/>
+      <source>In 3d mode</source>
+      <translation>En mode 3D</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="351"/>
+      <source>In 2d mode</source>
+      <translation>En mode 2D</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="354"/>
+      <source>Color scale</source>
+      <translation>Échelle de couleur</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="356"/>
+      <source>X position</source>
+      <translation>Position X</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="361"/>
+      <source>Y position</source>
+      <translation>Position Y</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="366"/>
+      <source>Width</source>
+      <translation>Largeur</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="371"/>
+      <source>Height</source>
+      <translation>Hauteur</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="376"/>
+      <source>Intervals number</source>
+      <translation>Nombre d&apos;intervalles</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="381"/>
+      <source>Text height</source>
+      <translation>Hauteur du texte</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="386"/>
+      <source>Text color</source>
+      <translation>Couleur du texte</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="392"/>
+      <source>Main menu</source>
+      <translation>Menu principal</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="394"/>
+      <source>Size</source>
+      <translation>Taille</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="397"/>
+      <source>Number of rows</source>
+      <translation>Nombre de rangées</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Preferences.cpp" line="404"/>
+      <source>Show Status Bar</source>
+      <translation>Afficher la barre d&apos;état</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_WidgetFileSelector</name>
+    <message>
+      <location filename="ModuleBase_WidgetFileSelector.cpp" line="70"/>
+      <source>Select file...</source>
+      <translation>Choisir le dossier...</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_WidgetMultiSelector</name>
+    <message>
+      <location filename="ModuleBase_WidgetMultiSelector.cpp" line="133"/>
+      <source>Type</source>
+      <translation>Type</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetMultiSelector.cpp" line="188"/>
+      <source>Show only</source>
+      <translation>Montrer seulement</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetMultiSelector.cpp" line="199"/>
+      <source>Add elements that share the same topology</source>
+      <translation>Ajouter des éléments qui partagent la même topologie</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_WidgetPointInput</name>
+    <message>
+      <location filename="ModuleBase_WidgetPointInput.cpp" line="63"/>
+      <source>X coordinate</source>
+      <translation>Coordonnée X</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetPointInput.cpp" line="71"/>
+      <source>Y coordinate</source>
+      <translation>Coordonnée Y</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetPointInput.cpp" line="79"/>
+      <source>Z coordinate</source>
+      <translation>Coordonnée Z</translation>
+    </message>
+  </context>
+  <context>
+    <name>ModuleBase_WidgetSelectionFilter</name>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="242"/>
+      <source>Filters</source>
+      <translation>Filtres</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="253"/>
+      <source>Add new filter...</source>
+      <translation>Ajouter un nouveau filtre...</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="276"/>
+      <source>Select</source>
+      <translation>Sélectionner</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="287"/>
+      <source>Number of selected objects:</source>
+      <translation>Nombre d&apos;objets sélectionnés:</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="293"/>
+      <source>Show only</source>
+      <translation>Montrer seulement</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="551"/>
+      <location filename="ModuleBase_WidgetSelectionFilter.cpp" line="631"/>
+      <source>Selection is empty</source>
+      <translation>La sélection est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>QObject</name>
+    <message>
+      <location filename="ModuleBase_Tools.cpp" line="942"/>
+      <source>Selected objects can be used in Part documents which are not loaded: %1.
+</source>
+      <translation>Les objets sélectionnés peuvent être utilisés dans les documents de pièce non chargés : %1.
+</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Tools.cpp" line="1011"/>
+      <source>Delete features</source>
+      <translation>Supprimer les fonctionnalités</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Tools.cpp" line="1021"/>
+      <source>The following parts will be deleted: %1.
+</source>
+      <translation>Les pièces suivantes seront supprimées : %1.
+
+</translation>
+    </message>
+    <message>
+      <location filename="ModuleBase_Tools.cpp" line="1039"/>
+      <source>Replace</source>
+      <translation>Remplacer</translation>
+    </message>
+  </context>
+</TS>
index 17aa1caabf0bbf73ac3c2751b728488e6e023fc1..8887619f9a1c652bf2f72663bf85ff8fc8eb5a0c 100644 (file)
@@ -78,6 +78,7 @@ ADD_DEFINITIONS(-DPARAMETERSPLUGIN_EXPORTS ${OpenCASCADE_DEFINITIONS})
 SET(TEXT_RESOURCES
        ParametersPlugin_msg_ru.ts
        ParametersPlugin_msg_en.ts
+       ParametersPlugin_msg_fr.ts
 )
 
 # QT4_CREATE_TRANSLATION(QM_RESOURCES
diff --git a/src/ParametersPlugin/ParametersPlugin_msg_fr.ts b/src/ParametersPlugin/ParametersPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..6bd03a1
--- /dev/null
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Parameter</source>
+      <translation>Paramètre</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>ModuleBase_Dialog</name>
+    <message>
+      <source>Parameters</source>
+      <translation>Paramètres</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Parameter</name>
+    <message>
+      <source>Create a parameter</source>
+      <translation>Créer un paramètre</translation>
+    </message>
+    <message>
+      <source>Parameter</source>
+      <translation>Paramètre</translation>
+    </message>
+    <message>
+      <source>Attribute "variable" is not initialized.</source>
+      <translation>Définir le nom de la variable</translation>
+    </message>
+    <message>
+      <source>Expression error.</source>
+      <translation>Erreur d&apos;expression.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Parameter:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "expression" is not initialized.</source>
+      <translation>Définir l&apos;expression</translation>
+    </message>
+  </context>
+  <context>
+    <name>Parameter:comment</name>
+    <message>
+      <source>Comment</source>
+      <translation>Commentaire</translation>
+    </message>
+  </context>
+  <context>
+    <name>Parameter:expression</name>
+    <message>
+      <source>Please input the expression</source>
+      <translation>S&apos;il vous plaît entrer l&apos;expression</translation>
+    </message>
+  </context>
+  <context>
+    <name>Parameter:expression:Parameters_ExpressionValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Parameter:variable</name>
+    <message>
+      <source>Name</source>
+      <translation>Nom</translation>
+    </message>
+    <message>
+      <source>Please input the parameter name</source>
+      <translation>Veuillez saisir le nom du paramètre</translation>
+    </message>
+  </context>
+  <context>
+    <name>Parameter:variable:Parameters_VariableValidator</name>
+    <message>
+      <source>Attribute "%1" value is empty.</source>
+      <translation>La valeur de l&apos;attribut &quot;%1&quot; est vide.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>ParametersMgr</name>
+    <message>
+      <source>Manage parameters</source>
+      <translation>Gérer les paramètres</translation>
+    </message>
+    <message>
+      <source>Parameters</source>
+      <translation>Paramètres</translation>
+    </message>
+  </context>
+  <context>
+    <name>ParametersMgr</name>
+    <message>
+      <source>Add</source>
+      <translation>Ajouter</translation>
+    </message>
+    <message>
+      <source>Comment</source>
+      <translation>Commentaire</translation>
+    </message>
+    <message>
+      <source>Expression</source>
+      <translation>Expression</translation>
+    </message>
+    <message>
+      <source>Features</source>
+      <translation>Caractéristiques</translation>
+    </message>
+    <message>
+      <source>Insert</source>
+      <translation>Insérer</translation>
+    </message>
+    <message>
+      <source>Name</source>
+      <translation>Nom</translation>
+    </message>
+    <message>
+      <source>Remove</source>
+      <translation>Retirer</translation>
+    </message>
+    <message>
+      <source>Result</source>
+      <translation>Résultat</translation>
+    </message>
+    <message>
+      <source>See preview</source>
+      <translation>Voir l&apos;aperçu</translation>
+    </message>
+    <message>
+      <source>&lt;NoName&gt;</source>
+      <translation>&lt;SansNom&gt;</translation>
+    </message>
+    <message>
+      <source>&lt;NoValue&gt;</source>
+      <translation>&lt;AucuneValeur&gt;</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>ParametersPlugin</name>
+    <message>
+      <source>Warning</source>
+      <translation>Attention</translation>
+    </message>
+    <message>
+      <source>Selected objects can be used in Part documents which are not loaded: %1. Would you like to continue?</source>
+      <translation>Les objets sélectionnés peuvent être utilisés dans les documents de pièce non chargés : %1. Voulez-vous continuer ?</translation>
+    </message>
+  </context>
+
+</TS>
index b818e20c90ed87d840808ff28365721d1242f21d..e42977ab0b0c490b0b1ae7b16cbef089066f210b 100644 (file)
@@ -118,7 +118,7 @@ SET(PROJECT_RESOURCES
 )
 
 SET(TEXT_RESOURCES
-#    PartSet_msg_fr.ts
+    PartSet_msg_fr.ts
 )
 
 SET(PROJECT_LIBRARIES
@@ -139,14 +139,16 @@ QT_WRAP_MOC(PROJECT_AUTOMOC ${PROJECT_MOC_HEADERS})
 QT_ADD_RESOURCES(PROJECT_COMPILED_RESOURCES ${PROJECT_RESOURCES})
 
 IF (${UPDATE_TRANSLATION})
-    SET(PROJECT_FILES ${PROJECT_SOURCES} ${ROJECT_HEADERS} )
+    SET(PROJECT_FILES ${PROJECT_SOURCES} ${PROJECT_HEADERS} )
     QT5_CREATE_TRANSLATION(QM_RESOURCES
                            ${PROJECT_FILES}
                            ${TEXT_RESOURCES}
                            OPTIONS -extensions cpp -no-recursive
                           )
 ELSE(${UPDATE_TRANSLATION})
-    QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    IF(${MAKE_TRANSLATION})
+        QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    ENDIF(${MAKE_TRANSLATION})
 ENDIF(${UPDATE_TRANSLATION})
 
 SOURCE_GROUP ("Generated Files" FILES ${PROJECT_AUTOMOC} ${PROJECT_COMPILED_RESOURCES} ${QM_RESOURCES})
index 21465eb1cb133887e2a96caf458beb7fe9b87fd6..e18ca5bb063b58a5716997908d3c8b078328ac4d 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-#include <PartSet_CustomPrs.h>
-#include <PartSet_Module.h>
+#include "PartSet_CustomPrs.h"
+#include "PartSet_Module.h"
 #include "PartSet_OperationPrs.h"
 #include "PartSet_OverconstraintListener.h"
+#include "PartSet_SketcherMgr.h"
 
 #include <XGUI_ModuleConnector.h>
 #include <XGUI_Workshop.h>
@@ -30,6 +31,9 @@
 #include <ModuleBase_IViewer.h>
 #include <ModuleBase_Tools.h>
 
+#include <ModelAPI_Tools.h>
+#include <SketchPlugin_Sketch.h>
+
 #include <Config_PropManager.h>
 #include <Events_Loop.h>
 #include <ModelAPI_Events.h>
@@ -68,12 +72,22 @@ bool PartSet_CustomPrs::activate(const FeaturePtr& theFeature,
 #ifdef DO_NOT_VISUALIZE_CUSTOM_PRESENTATION
   return false;
 #endif
+  bool isModified = false;
 
-  myIsActive[theFlag] = true;
-  myFeature = theFeature;
+  // Do not call customisation for sketcher and all its sub-objects
+  if (theFeature->getKind() == SketchPlugin_Sketch::ID())
+    return isModified;
+
+  FeaturePtr aParent = ModelAPI_Tools::compositeOwner(theFeature);
+  if (aParent.get()) {
+    std::string aType = aParent->getKind();
+    if (aType == SketchPlugin_Sketch::ID())
+      return isModified;
+  }
 
-  bool isModified = false;
   if (theFeature.get()) {
+    myIsActive[theFlag] = true;
+    myFeature = theFeature;
     displayPresentation(theFlag, theUpdateViewer);
     isModified = true;
   }
index 0ad3ce8f22bf20accb23f184853d37930ddd21ac..5245438e5abd441500d7ef6e4fb546ae597551a8 100644 (file)
@@ -67,8 +67,9 @@
 #include <ModuleBase_WidgetFactory.h>
 #include <ModuleBase_OperationDescription.h>
 #include <ModuleBase_ViewerPrs.h>
-#include <ModelAPI_ResultField.h>
+#include <ModuleBase_ResultPrs.h>
 
+#include <ModelAPI_ResultField.h>
 #include <ModelAPI_Object.h>
 #include <ModelAPI_Events.h>
 #include <ModelAPI_Validator.h>
@@ -80,6 +81,7 @@
 #include <ModelAPI_Tools.h>
 #include <ModelAPI_ResultConstruction.h>
 #include <ModelAPI_AttributeIntArray.h>
+#include <ModelAPI_ResultGroup.h>
 
 #include <GeomDataAPI_Point2D.h>
 #include <GeomDataAPI_Point.h>
@@ -89,7 +91,6 @@
 #include <XGUI_ActiveControlSelector.h>
 #include <XGUI_ActionsMgr.h>
 #include <XGUI_ContextMenuMgr.h>
-#include <XGUI_CustomPrs.h>
 #include <XGUI_DataModel.h>
 #include <XGUI_Displayer.h>
 #include <XGUI_ErrorMgr.h>
@@ -191,6 +192,26 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop)
 
   setDefaultConstraintShown();
 
+  //Config_PropManager::registerProp("Visualization", "object_default_color", "Object color",
+  //                                 Config_Prop::Color, "225,225,225");
+
+  Config_PropManager::registerProp("Visualization", "result_body_color", "Result color",
+    Config_Prop::Color, ModelAPI_ResultBody::DEFAULT_COLOR());
+
+  Config_PropManager::registerProp("Visualization", "result_group_color", "Group color",
+    Config_Prop::Color, ModelAPI_ResultGroup::DEFAULT_COLOR());
+
+  Config_PropManager::registerProp("Visualization", "result_construction_color",
+    "Construction color",
+    Config_Prop::Color,
+    ModelAPI_ResultConstruction::DEFAULT_COLOR());
+
+  Config_PropManager::registerProp("Visualization", "result_part_color", "Part color",
+    Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR());
+
+  Config_PropManager::registerProp("Visualization", "result_field_color", "Field color",
+    Config_Prop::Color, ModelAPI_ResultField::DEFAULT_COLOR());
+
   Config_PropManager::registerProp("Visualization", "operation_parameter_color",
                           "Reference shape wireframe color in operation", Config_Prop::Color,
                           PartSet_CustomPrs::OPERATION_PARAMETER_COLOR());
@@ -1166,75 +1187,75 @@ void PartSet_Module::deactivateCustomPrs(const ModuleBase_CustomizeFlag& theFlag
 }
 
 //******************************************************
-bool PartSet_Module::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
-                                           std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs)
-{
-  bool aCustomized = false;
-
-  XGUI_Workshop* aWorkshop = getWorkshop();
-  XGUI_Displayer* aDisplayer = aWorkshop->displayer();
-  ObjectPtr anObject = aDisplayer->getObject(thePrs);
-  if (!anObject)
-    return aCustomized;
-
-  if (!theResult.get()) {
-    std::vector<int> aColor;
-    XGUI_CustomPrs::getDefaultColor(anObject, true, aColor);
-    if (!aColor.empty()) {
-      aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
-    }
-  }
-  // customize dimentional constrains
-  sketchMgr()->customizePresentation(anObject);
-
-  return aCustomized;
-}
-
-//******************************************************
-bool PartSet_Module::afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
-                                                AISObjectPtr thePrs,
-                                                GeomCustomPrsPtr theCustomPrs)
-{
-  bool aCustomized = false;
-
-  XGUI_Workshop* aWorkshop = getWorkshop();
-  XGUI_Displayer* aDisplayer = aWorkshop->displayer();
-  ObjectPtr anObject = aDisplayer->getObject(thePrs);
-  if (!anObject)
-    return aCustomized;
-
-  std::vector<int> aColor;
-  bool aUseCustomColor = true;
-  if (aUseCustomColor)
-    myOverconstraintListener->getCustomColor(anObject, aColor);
-  // customize sketch symbol presentation
-  Handle(AIS_InteractiveObject) anAISIO = thePrs->impl<Handle(AIS_InteractiveObject)>();
-  if (!anAISIO.IsNull()) {
-    if (!Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO).IsNull()) {
-      Handle(SketcherPrs_SymbolPrs) aPrs = Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO);
-      if (!aPrs.IsNull()) {
-        aPrs->SetCustomColor(aColor);
-        aCustomized = true;
-      }
-    } else if (!Handle(SketcherPrs_Coincident)::DownCast(anAISIO).IsNull()) {
-      Handle(SketcherPrs_Coincident) aPrs = Handle(SketcherPrs_Coincident)::DownCast(anAISIO);
-      if (!aPrs.IsNull()) {
-        aPrs->SetCustomColor(aColor);
-        aCustomized = true;
-      }
-    }
-  }
-  // customize sketch dimension constraint presentation
-  if (!aCustomized) {
-    if (!aColor.empty()) { // otherwise presentation has the default color
-      aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
-    }
-  }
-  return aCustomized;
-}
-
-//******************************************************
-bool PartSet_Module::customizeObject(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
+//bool PartSet_Module::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
+//                                           std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs)
+//{
+//  bool aCustomized = false;
+//
+//  XGUI_Workshop* aWorkshop = getWorkshop();
+//  XGUI_Displayer* aDisplayer = aWorkshop->displayer();
+//  ObjectPtr anObject = aDisplayer->getObject(thePrs);
+//  if (!anObject)
+//    return aCustomized;
+//
+//  if (!theResult.get()) {
+//    std::vector<int> aColor;
+//    XGUI_CustomPrs::getDefaultColor(anObject, true, aColor);
+//    if (!aColor.empty()) {
+//      aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+//    }
+//  }
+//  // customize dimentional constrains
+//  sketchMgr()->customisePresentation(anObject);
+//
+//  return aCustomized;
+//}
+//
+////******************************************************
+//bool PartSet_Module::afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
+//                                                AISObjectPtr thePrs,
+//                                                GeomCustomPrsPtr theCustomPrs)
+//{
+//  bool aCustomized = false;
+//
+//  XGUI_Workshop* aWorkshop = getWorkshop();
+//  XGUI_Displayer* aDisplayer = aWorkshop->displayer();
+//  ObjectPtr anObject = aDisplayer->getObject(thePrs);
+//  if (!anObject)
+//    return aCustomized;
+//
+//  std::vector<int> aColor;
+//  bool aUseCustomColor = true;
+//  if (aUseCustomColor)
+//    myOverconstraintListener->getCustomColor(anObject, aColor);
+//  // customize sketch symbol presentation
+//  Handle(AIS_InteractiveObject) anAISIO = thePrs->impl<Handle(AIS_InteractiveObject)>();
+//  if (!anAISIO.IsNull()) {
+//    if (!Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO).IsNull()) {
+//      Handle(SketcherPrs_SymbolPrs) aPrs = Handle(SketcherPrs_SymbolPrs)::DownCast(anAISIO);
+//      if (!aPrs.IsNull()) {
+//        aPrs->SetCustomColor(aColor);
+//        aCustomized = true;
+//      }
+//    } else if (!Handle(SketcherPrs_Coincident)::DownCast(anAISIO).IsNull()) {
+//      Handle(SketcherPrs_Coincident) aPrs = Handle(SketcherPrs_Coincident)::DownCast(anAISIO);
+//      if (!aPrs.IsNull()) {
+//        aPrs->SetCustomColor(aColor);
+//        aCustomized = true;
+//      }
+//    }
+//  }
+//  // customize sketch dimension constraint presentation
+//  if (!aCustomized) {
+//    if (!aColor.empty()) { // otherwise presentation has the default color
+//      aCustomized = thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+//    }
+//  }
+//  return aCustomized;
+//}
+
+//******************************************************
+bool PartSet_Module::customizeFeature(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
                                      const bool theUpdateViewer)
 {
   bool isRedisplayed = false;
@@ -1279,21 +1300,100 @@ void PartSet_Module::onActiveDocPopup(const QPoint& thePnt)
 }
 
 //******************************************************
-Handle(AIS_InteractiveObject) PartSet_Module::createPresentation(const ObjectPtr& theObject)
+AISObjectPtr PartSet_Module::createPresentation(const ObjectPtr& theObject)
+{
+  Handle(AIS_InteractiveObject) anAISPrs = mySketchMgr->createPresentation(theObject);
+  if (anAISPrs.IsNull()) {
+    ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+    if (aResult.get()) {
+      std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
+      if (aShapePtr.get() != NULL)
+        anAISPrs = new ModuleBase_ResultPrs(aResult);
+    }
+    else {
+      FieldStepPtr aStep =
+        std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(theObject);
+      if (aStep.get()) {
+        anAISPrs = new PartSet_FieldStepPrs(aStep);
+      }
+    }
+  }
+  AISObjectPtr anAIS;
+  if (!anAISPrs.IsNull()) {
+    Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs);
+    if (!aShapePrs.IsNull())
+      ModuleBase_Tools::setPointBallHighlighting((AIS_Shape*)aShapePrs.get());
+
+    anAIS = AISObjectPtr(new GeomAPI_AISObject());
+    anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
+    customizePresentation(theObject, anAIS);
+  }
+  return anAIS;
+}
+
+//******************************************************
+void getResultColor(const ResultPtr& theResult, std::vector<int>& theColor)
 {
-  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
-  if (aResult.get())
-    return mySketchMgr->createPresentation(aResult);
+  ModelAPI_Tools::getColor(theResult, theColor);
+  if (theColor.empty())
+    PartSet_Tools::getDefaultColor(theResult, false, theColor);
+}
+
+//******************************************************
+double getResultDeflection(const ResultPtr& theResult)
+{
+  double aDeflection = ModelAPI_Tools::getDeflection(theResult);
+  if (aDeflection < 0)
+    aDeflection = PartSet_Tools::getDefaultDeflection(theResult);
+  return aDeflection;
+}
+
+//******************************************************
+double getResultTransparency(const ResultPtr& theResult)
+{
+  double aTransparency = ModelAPI_Tools::getTransparency(theResult);
+  if (aTransparency < 0)
+    aTransparency = PartSet_Tools::getDefaultTransparency();
+  return aTransparency;
+}
+
+
+//******************************************************
+void PartSet_Module::customizePresentation(const ObjectPtr& theObject, const AISObjectPtr& thePrs) const
+{
+  if (mySketchMgr->isSketchStarted()) {
+    mySketchMgr->customizeSketchPresentation(theObject, thePrs);
+  }
   else {
-    FieldStepPtr aStep =
-      std::dynamic_pointer_cast<ModelAPI_ResultField::ModelAPI_FieldStep>(theObject);
-    if (aStep.get()) {
-      return new PartSet_FieldStepPrs(aStep);
+    ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+    if (aResult.get()) {
+      std::vector<int> aColor;
+      getResultColor(aResult, aColor);
+
+      SessionPtr aMgr = ModelAPI_Session::get();
+      if (aMgr->activeDocument() != aResult->document()) {
+        QColor aQColor(aColor[0], aColor[1], aColor[2]);
+        QColor aNewColor =
+          QColor::fromHsvF(aQColor.hueF(), aQColor.saturationF() / 3., aQColor.valueF());
+        aColor[0] = aNewColor.red();
+        aColor[1] = aNewColor.green();
+        aColor[2] = aNewColor.blue();
+      }
+      thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+
+      thePrs->setDeflection(getResultDeflection(aResult));
+
+      thePrs->setTransparency(getResultTransparency(aResult));
+    }
+    FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+    if (aFeature.get()) {
+      if (aFeature->getKind() == SketchPlugin_Sketch::ID())
+        thePrs->setWidth(2);
     }
   }
-  return Handle(AIS_InteractiveObject)();
 }
 
+
 //******************************************************
 ObjectPtr PartSet_Module::findPresentedObject(const AISObjectPtr& theAIS) const
 {
index bcd16ee1771476c5a5cfd3854f611d087bcfb479..5a6d25cc7276bcbddd215b37ade99819309574f9 100644 (file)
@@ -290,14 +290,14 @@ public:
                                    const bool theUpdateViewer);
 
   /// Modifies the given presentation in the custom way.
-  virtual bool customisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
-                                     AISObjectPtr thePrs,
-                                     std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs);
+  //virtual bool customisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
+  //                                   AISObjectPtr thePrs,
+  //                                   std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs);
 
-  /// Modifies the given presentation in the custom way after usual customize is performed.
-  virtual bool afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
-                                          AISObjectPtr thePrs,
-                                          GeomCustomPrsPtr theCustomPrs);
+  ///// Modifies the given presentation in the custom way after usual customize is performed.
+  //virtual bool afterCustomisePresentation(std::shared_ptr<ModelAPI_Result> theResult,
+  //                                        AISObjectPtr thePrs,
+  //                                        GeomCustomPrsPtr theCustomPrs);
 
   /// Update the object presentable properties such as color, lines width and other
   /// If the object is result with the color attribute value set, it is used,
@@ -307,8 +307,8 @@ public:
   /// should be updated(e.g. only highlighted elements)
   /// \param theUpdateViewer the parameter whether the viewer should be update immediatelly
   /// \returns true if the object is modified
-  virtual bool customizeObject(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
-                               const bool theUpdateViewer);
+  virtual bool customizeFeature(ObjectPtr theObject, const ModuleBase_CustomizeFlag& theFlag,
+                                const bool theUpdateViewer);
 
   /// Disable displaying of custom mode
   /// \param theMode a mode to disable
@@ -327,7 +327,12 @@ public:
   /// Create specific for the module presentation
   /// \param theResult an object for presentation
   /// \return created presentation or NULL(default value)
-  virtual Handle(AIS_InteractiveObject) createPresentation(const ObjectPtr& theResult);
+  virtual AISObjectPtr createPresentation(const ObjectPtr& theResult);
+
+  /// Customize presentation according to objects attributes
+  /// \param theObject an object for presentation
+  /// \param thePrs a presentation object
+  virtual void customizePresentation(const ObjectPtr& theObject, const AISObjectPtr& thePrs) const;
 
   //! Returns data object by AIS
   virtual ObjectPtr findPresentedObject(const AISObjectPtr& theAIS) const;
index 59fbfa96edecbb2bb0b055177e1fca6800e81ecd..70c19725c8ff56b0221dc9c9e7d358bd78f668c3 100644 (file)
@@ -25,7 +25,6 @@
 #include <PartSet_SketcherMgr.h>
 #include <PartSet_SketcherReentrantMgr.h>
 
-#include "XGUI_CustomPrs.h"
 #include "XGUI_Displayer.h"
 #include "XGUI_ModuleConnector.h"
 #include "XGUI_OperationMgr.h"
@@ -284,7 +283,7 @@ void PartSet_OverconstraintListener::redisplayObjects(
 {
   static Events_Loop* aLoop = Events_Loop::loop();
 
-  static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+  static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_VISUAL_ATTRIBUTES);
   static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get();
 
   std::set<ObjectPtr>::const_iterator anIt = theObjects.begin(), aLast = theObjects.end();
index 5481f9d947d9e866a2454fce010d6136fb1ee8c6..a02dee98e5036150619507b34b019c66a607e661 100644 (file)
@@ -58,6 +58,14 @@ public:
   /// Redefinition of Events_Listener method
   virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);
 
+
+  bool isConflictingObject(const ObjectPtr& theObject) const
+  {
+    return (myConflictingObjects.find(theObject) != myConflictingObjects.end());
+  }
+
+  bool isFullyConstrained() const { return myIsFullyConstrained; }
+
 protected:
   /// Append objects to the internal container of conflicting object, redisplay necessary objects
   /// \param theObjects a list of new conflicting objects
index e5118c9b99b8443f9182f4f7c6850afab83a7512..d6e5febf1fe4277ddffd2e5f912fd146f3e23df4 100644 (file)
 #include <QMessageBox>
 #include <QMainWindow>
 
+#include <set>
+
 //#define DEBUG_DO_NOT_BY_ENTER
 //#define DEBUG_SKETCHER_ENTITIES
 //#define DEBUG_SKETCH_ENTITIES_ON_MOVE
@@ -170,7 +172,8 @@ PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule)
   : QObject(theModule), myModule(theModule), myIsEditLaunching(false), myIsDragging(false),
     myDragDone(false), myIsMouseOverWindow(false),
     myIsMouseOverViewProcessed(true), myPreviousUpdateViewerEnabled(true),
-    myIsPopupMenuActive(false), myExternalPointsMgr(0), myNoDragMoving(false)
+    myIsPopupMenuActive(false), myExternalPointsMgr(0), myNoDragMoving(false),
+    myIsSketchStarted(false)
 {
   ModuleBase_IWorkshop* anIWorkshop = myModule->workshop();
   ModuleBase_IViewer* aViewer = anIWorkshop->viewer();
@@ -201,6 +204,8 @@ PartSet_SketcherMgr::PartSet_SketcherMgr(PartSet_Module* theModule)
 
   registerSelectionFilter(SF_SketchCirclePointFilter, new PartSet_CirclePointFilter(anIWorkshop));
   registerSelectionFilter(SF_SketchPlaneFilter, new ModuleBase_ShapeInPlaneFilter());
+
+  Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_DOF_OBJECTS));
 }
 
 PartSet_SketcherMgr::~PartSet_SketcherMgr()
@@ -466,8 +471,9 @@ void PartSet_SketcherMgr::onMousePressed(ModuleBase_IViewWindow* theWnd, QMouseE
 void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouseEvent* theEvent)
 {
   ModuleBase_IWorkshop* aWorkshop = myModule->workshop();
+  ModuleBase_IViewer* aViewer = aWorkshop->viewer();
   if (myIsDragging)
-    aWorkshop->viewer()->enableDrawMode(myPreviousDrawModeEnabled);
+    aViewer->enableDrawMode(myPreviousDrawModeEnabled);
 
   bool aWasDragging = myIsDragging;
   myIsDragging = false;
@@ -479,11 +485,10 @@ void PartSet_SketcherMgr::onMouseReleased(ModuleBase_IViewWindow* theWnd, QMouse
   if (!myIsMouseOverViewProcessed) {
     return;
   }
-  ModuleBase_IViewer* aViewer = aWorkshop->viewer();
   //if (!aViewer->canDragByMouse())
   //  return;
   ModuleBase_OperationFeature* aOp =
-      dynamic_cast<ModuleBase_OperationFeature*>(getCurrentOperation());
+    dynamic_cast<ModuleBase_OperationFeature*>(getCurrentOperation());
   if (aOp) {
     bool aStartNoDragOperation = !aViewer->canDragByMouse() && aOp->isEditOperation();
     if (aStartNoDragOperation || myNoDragMoving) {
@@ -883,13 +888,15 @@ void PartSet_SketcherMgr::sketchSelectionModes(const CompositeFeaturePtr& theSke
   theModes.append(TopAbs_EDGE);
 }
 
-Handle(AIS_InteractiveObject) PartSet_SketcherMgr::createPresentation(const ResultPtr& theResult)
+Handle(AIS_InteractiveObject) PartSet_SketcherMgr::createPresentation(const ObjectPtr& theObj)
 {
   Handle(AIS_InteractiveObject) aPrs;
 
-  FeaturePtr aFeature = ModelAPI_Feature::feature(theResult);
+  FeaturePtr aFeature = ModelAPI_Feature::feature(theObj);
   if (aFeature.get() && aFeature->getKind() == SketchPlugin_Sketch::ID()) {
-    aPrs = new PartSet_ResultSketchPrs(theResult);
+    ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObj);
+    if (aResult.get())
+      aPrs = new PartSet_ResultSketchPrs(aResult);
   }
   return aPrs;
 }
@@ -991,11 +998,15 @@ bool PartSet_SketcherMgr::isDistanceKind(std::string& theKind)
 
 void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
 {
+  static Events_ID EVENT_ATTR = Events_Loop::loop()->eventByName(EVENT_VISUAL_ATTRIBUTES);
+  static Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
+
   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
                                                                (getCurrentOperation());
   if (!aFOperation)
     return;
 
+  myIsSketchStarted = true;
   SketcherPrs_Tools::setPixelRatio(ModuleBase_Tools::currentPixelRatio());
 
   myModule->onViewTransformed();
@@ -1063,7 +1074,6 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
   myModule->overconstraintListener()->setActive(true);
   // Display sketcher objects
   QStringList anInfo;
-  Events_ID EVENT_DISP = Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY);
   const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get();
   aNumberOfSubs = myCurrentSketch->numberOfSubs();
   for (int i = 0; i < aNumberOfSubs; i++) {
@@ -1084,6 +1094,7 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
       aECreator->sendUpdated(aFeature, EVENT_DISP);
     else
       aFeature->setDisplayed(true);
+    aECreator->sendUpdated(aFeature, EVENT_ATTR);
   }
 #ifdef DEBUG_SKETCHER_ENTITIES
   QString anInfoStr = anInfo.join(";\t");
@@ -1100,7 +1111,8 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation)
   workshop()->selectionActivate()->updateSelectionFilters();
   workshop()->selectionActivate()->updateSelectionModes();
 
-  Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+  Events_Loop::loop()->flush(EVENT_DISP);
+  Events_Loop::loop()->flush(EVENT_ATTR);
 
   myExternalPointsMgr = new PartSet_ExternalPointsMgr(myModule->workshop(), myCurrentSketch);
 
@@ -1117,6 +1129,8 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation)
   myModule->workshop()->viewer()->setFitter(0);
   delete aFitter;
 
+  myIsSketchStarted = false;
+
   myIsMouseOverWindow = false;
   myIsConstraintsShown[PartSet_Tools::Geometrical] = true;
   myIsConstraintsShown[PartSet_Tools::Dimensional] = true;
@@ -1775,26 +1789,26 @@ void PartSet_SketcherMgr::widgetStateChanged(int thePreviousState)
   }
 }
 
-void PartSet_SketcherMgr::customizePresentation(const ObjectPtr& theObject)
-{
-  ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
-                                                                           (getCurrentOperation());
-  if (aFOperation && (PartSet_SketcherMgr::isSketchOperation(aFOperation) ||
-                      isNestedSketchOperation(aFOperation)))
-    SketcherPrs_Tools::sendExpressionShownEvent(myIsConstraintsShown[PartSet_Tools::Expressions]);
-
-  // update entities selection priorities
-  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
-  if (aFeature.get() && PartSet_SketcherMgr::isEntity(aFeature->getKind())) {
-    // update priority for feature
-    updateSelectionPriority(aFeature, aFeature);
-    // update priority for results of the feature
-    std::list<ResultPtr> aResults = aFeature->results();
-    std::list<ResultPtr>::const_iterator anIt = aResults.begin(), aLastIt = aResults.end();
-    for (; anIt != aLastIt; anIt++)
-      updateSelectionPriority(*anIt, aFeature);
-  }
-}
+//void PartSet_SketcherMgr::customisePresentation(const ObjectPtr& theObject)
+//{
+//  ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
+//                                                                           (getCurrentOperation());
+//  if (aFOperation && (PartSet_SketcherMgr::isSketchOperation(aFOperation) ||
+//                      isNestedSketchOperation(aFOperation)))
+//    SketcherPrs_Tools::sendExpressionShownEvent(myIsConstraintsShown[PartSet_Tools::Expressions]);
+//
+//  // update entities selection priorities
+//  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+//  if (aFeature.get() && PartSet_SketcherMgr::isEntity(aFeature->getKind())) {
+//    // update priority for feature
+//    updateSelectionPriority(aFeature, aFeature);
+//    // update priority for results of the feature
+//    std::list<ResultPtr> aResults = aFeature->results();
+//    std::list<ResultPtr>::const_iterator anIt = aResults.begin(), aLastIt = aResults.end();
+//    for (; anIt != aLastIt; anIt++)
+//      updateSelectionPriority(*anIt, aFeature);
+//  }
+//}
 
 ModuleBase_Operation* PartSet_SketcherMgr::getCurrentOperation() const
 {
@@ -2114,7 +2128,153 @@ void PartSet_SketcherMgr::onShowPoints(bool toShow)
     aViewer->update();
 }
 
+void PartSet_SketcherMgr::processEvent(const std::shared_ptr<Events_Message>& theMessage)
+{
+  if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOF_OBJECTS)) {
+    std::shared_ptr<ModelAPI_ObjectUpdatedMessage> anUpdateMsg =
+      std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+    std::set<ObjectPtr> aObjects = anUpdateMsg->objects();
+    std::set<ObjectPtr>::const_iterator aIt;
+    QList<ModuleBase_ViewerPrsPtr> aPrsList;
+    for (aIt = aObjects.cbegin(); aIt != aObjects.cend(); aIt++) {
+      FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*aIt);
+      if (aFeature.get()) {
+        std::list<ResultPtr> aRes = aFeature->results();
+        std::list<ResultPtr>::const_iterator aIt;
+        for (aIt = aRes.cbegin(); aIt != aRes.cend(); ++aIt) {
+          ModuleBase_ViewerPrsPtr aPrsPtr(new ModuleBase_ViewerPrs(*aIt));
+          aPrsList.append(aPrsPtr);
+        }
+      }
+    }
+    if (aPrsList.size() > 0) {
+      myModule->workshop()->setSelected(aPrsList);
+    }
+  }
+}
+
+bool isExternal(const ObjectPtr& theObject)
+{
+  AttributeSelectionPtr aAttr =
+    theObject->data()->selection(SketchPlugin_SketchEntity::EXTERNAL_ID());
+  if (aAttr)
+    return aAttr->context().get() != NULL && !aAttr->isInvalid();
+  return false;
+}
+
+bool isCopy(const ObjectPtr& theObject)
+{
+  AttributeBooleanPtr anAttr = theObject->data()->boolean(SketchPlugin_SketchEntity::COPY_ID());
+  if (anAttr.get())
+    return anAttr->value();
+  return false;
+}
+
+bool isIncludeToResult(const ObjectPtr& theObject)
+{
+  AttributeBooleanPtr anAttr;
+  std::set<AttributePtr> aRefsToMe = theObject->data()->refsToMe();
+  std::set<AttributePtr>::const_iterator aIt;
+  for (aIt = aRefsToMe.cbegin(); aIt != aRefsToMe.cend(); ++aIt) {
+    if ((*aIt)->id() == SketchPlugin_Projection::PROJECTED_FEATURE_ID()) {
+      FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>((*aIt)->owner());
+      if (aFeature.get()) {
+        anAttr = aFeature->data()->boolean(SketchPlugin_Projection::INCLUDE_INTO_RESULT());
+        if (anAttr.get())
+          return anAttr->value();
+      }
+    }
+  }
+  return true;
+}
+
+
+void PartSet_SketcherMgr::customizeSketchPresentation(const ObjectPtr& theObject,
+  const AISObjectPtr& thePrs) const
+{
+  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+  PartSet_OverconstraintListener* aOCListener = myModule->overconstraintListener();
+
+  // Check constraints objects
+  const QStringList& aConstrIds = constraintsIdList();
+  std::string aKind = aFeature->getKind();
+  if (aConstrIds.contains(QString(aKind.c_str()))) {
+    std::vector<int> aColor;
+    if (aOCListener->isConflictingObject(theObject))
+      aColor = Config_PropManager::color("Visualization", "sketch_overconstraint_color");
+    else if (isDistanceKind(aKind))
+      aColor = Config_PropManager::color("Visualization", "sketch_dimension_color");
+
+    if (!aColor.empty())
+      thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+    return;
+  }
+  int aShapeType = thePrs->getShapeType();
+  // a compound is processed like the edge because the
+  // arc feature uses the compound for presentable AIS
+  if (aShapeType != 6/*an edge*/ && aShapeType != 7/*a vertex*/ && aShapeType != 0/*compound*/)
+    return;
+
+  // set color from preferences
+  std::shared_ptr<ModelAPI_AttributeBoolean> anAuxiliaryAttr =
+    aFeature->data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
+  bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
+
+  std::vector<int> aColor;
+  if (aOCListener->isFullyConstrained())
+    aColor = Config_PropManager::color("Visualization", "sketch_fully_constrained_color");
+  else if (aOCListener->isConflictingObject(theObject))
+    aColor = Config_PropManager::color("Visualization", "sketch_overconstraint_color");
+  else {
+    if (isConstruction)
+      aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color");
+    else if (isExternal(aFeature))
+      aColor = Config_PropManager::color("Visualization", "sketch_external_color");
+    else
+      aColor = Config_PropManager::color("Visualization", "sketch_entity_color");
+  }
+  if (!aColor.empty()) {
+    // The code below causes redisplay again
+    if (ModelAPI_Session::get()->isOperation()) {
+      AttributeIntArrayPtr aColorAttr = theObject->data()->intArray(ModelAPI_Result::COLOR_ID());
+      if (aColorAttr.get()) {
+        aColorAttr->setSize(3, false);
+        // Set the color attribute in order do not use default colors in the presentation object
+        for (int i = 0; i < 3; i++)
+          aColorAttr->setValue(i, aColor[i], false);
+      }
+    }
+    thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+  }
+
+  if (aShapeType == 6 || aShapeType == 0) { // if this is an edge or a compound
+    if (isConstruction) {
+      // Set axilliary line
+      thePrs->setWidth(SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY());
+      thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY());
+    }
+    else {
+      int aWidth = Config_PropManager::integer("Visualization", "sketch_line_width");
+      thePrs->setWidth(aWidth);
+      thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE());
+    }
+  }
+  else if (aShapeType == 7) { // otherwise this is a vertex
+                              // The width value do not have effect on the point presentation.
+                              // It is defined in order to extend selection area of the object.
+    thePrs->setWidth(17);
+    //  thePrs->setPointMarker(1, 1.); // Set point as a '+' symbol
+  }
+  if (isCopy(aFeature) && !isIncludeToResult(aFeature)) {
+    double aWidth = thePrs->width();
+    thePrs->setWidth(aWidth / 2.5);
+  }
+
+  double aDeflection = Config_PropManager::real("Visualization", "construction_deflection");
+  thePrs->setDeflection(aDeflection);
+}
 
+//*************************************************************************************
 void PartSet_Fitter::fitAll(Handle(V3d_View) theView)
 {
   CompositeFeaturePtr aSketch = mySketchMgr->activeSketch();
index 7259514a4eb54083d520cf7e8863bc929d96a348..9336fdbf2235f0f705e4b187cab07a8661c8681d 100644 (file)
 #include <ModelAPI_Attribute.h>
 #include <ModelAPI_CompositeFeature.h>
 #include <ModelAPI_Result.h>
+#include <Events_Listener.h>
 #include <ModuleBase_SelectionFilterType.h>
 
 #include <ModuleBase_Definitions.h>
 #include <ModuleBase_ModelWidget.h>
 
 #include <GeomAPI_Pln.h>
+#include <GeomAPI_AISObject.h>
 
 #ifdef HAVE_SALOME
   #include <OCCViewer_ViewModel.h>
@@ -97,7 +99,7 @@ private:
   displayed in the viewer. After the sketch create/edit operation is finished, the sub-feature
   are hidden, the sketch feature result is displayed
 */
-class PARTSET_EXPORT PartSet_SketcherMgr : public QObject
+class PARTSET_EXPORT PartSet_SketcherMgr : public QObject, public Events_Listener
 {
   Q_OBJECT
   /// Struct to define gp point, with the state is the point is initialized
@@ -343,7 +345,7 @@ public:
   /// Create specific for the module presentation
   /// \param theResult an object for presentation
   /// \return created presentation or NULL(default value)
-  virtual Handle(AIS_InteractiveObject) createPresentation(const ResultPtr& theResult);
+  Handle(AIS_InteractiveObject) createPresentation(const ObjectPtr& theResult);
 
   /// Connects or disconnects to the value changed signal of the property panel widgets
   /// \param theWidget a property contol widget
@@ -357,7 +359,9 @@ public:
   /// If the current operation is a dimention one, the style of dimension visualization is send for
   /// the current object
   /// \param theObject an object to be customized
-  void customizePresentation(const ObjectPtr& theObject);
+  //void customisePresentation(const ObjectPtr& theObject);
+
+  void customizeSketchPresentation(const ObjectPtr& theObject, const AISObjectPtr& thePrs) const;
 
   /// Update sketch presentations according to the the state
   /// \param theType a type of sketch visualization style
@@ -371,6 +375,14 @@ public:
 
   PartSet_Module* module() const { return myModule; }
 
+  /** \brief Implementation of Event Listener method
+  *  \param[in] theMessage the data of the event
+  */
+  virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);
+
+  bool isSketchStarted() const { return myIsSketchStarted; }
+
+
 public slots:
   /// Process sketch plane selected event
   void onPlaneSelected(const std::shared_ptr<GeomAPI_Pln>& thePln);
@@ -496,6 +508,8 @@ private:
   QMap<ResultPtr, Handle(AIS_Shape)> myPointsHighlight;
 
   bool myNoDragMoving;
+
+  bool myIsSketchStarted;
 };
 
 
index 0ff7ad2e55b19e5261693d46cafb631bbd7d8343..fbb50228faf57290a384d347d72b2e8b0b0dffec 100644 (file)
@@ -36,6 +36,7 @@
 #include <ModelGeomAlgo_Point2D.h>
 
 #include <Events_Loop.h>
+#include <Events_InfoMessage.h>
 
 #include <SketcherPrs_Tools.h>
 
@@ -53,6 +54,7 @@
 #include <GeomAPI_Pnt.h>
 #include <GeomAPI_Edge.h>
 #include <GeomAPI_Vertex.h>
+#include <GeomAPI_ShapeExplorer.h>
 
 #include <GeomAPI_Dir.h>
 #include <GeomAPI_XYZ.h>
@@ -794,3 +796,58 @@ void PartSet_Tools::getFirstAndLastIndexInFolder(const ObjectPtr& theFolder,
   theFirst = aDoc->index(aFirstFeatureInFolder);
   theLast = aDoc->index(aLastFeatureInFolder);
 }
+
+
+void PartSet_Tools::getDefaultColor(ObjectPtr theObject, const bool isEmptyColorValid,
+  std::vector<int>& theColor)
+{
+  theColor.clear();
+  // get default color from the preferences manager for the given result
+  if (theColor.empty()) {
+    std::string aSection, aName, aDefault;
+    theObject->colorConfigInfo(aSection, aName, aDefault);
+    if (!aSection.empty() && !aName.empty()) {
+      theColor = Config_PropManager::color(aSection, aName);
+    }
+  }
+  if (!isEmptyColorValid && theColor.empty()) {
+    // all AIS objects, where the color is not set, are in black.
+    // The color should be defined in XML or set in the attribute
+    theColor = Config_PropManager::color("Visualization", "object_default_color");
+    Events_InfoMessage("PartSet_Tools",
+      "A default color is not defined in the preferences for this result type").send();
+  }
+}
+
+double PartSet_Tools::getDefaultDeflection(const ObjectPtr& theObject)
+{
+  double aDeflection = -1;
+  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+  if (aResult.get()) {
+    bool isConstruction = false;
+
+    std::string aResultGroup = aResult->groupName();
+    if (aResultGroup == ModelAPI_ResultConstruction::group())
+      isConstruction = true;
+    else if (aResultGroup == ModelAPI_ResultBody::group()) {
+      GeomShapePtr aGeomShape = aResult->shape();
+      if (aGeomShape.get()) {
+        // if the shape could not be exploded on faces, it contains only wires, edges, and vertices
+        // correction of deviation for them should not influence to the application performance
+        GeomAPI_ShapeExplorer anExp(aGeomShape, GeomAPI_Shape::FACE);
+        isConstruction = !anExp.more();
+      }
+    }
+    if (isConstruction)
+      aDeflection = Config_PropManager::real("Visualization", "construction_deflection");
+    else
+      aDeflection = Config_PropManager::real("Visualization", "body_deflection");
+  }
+  return aDeflection;
+}
+
+
+double PartSet_Tools::getDefaultTransparency()
+{
+  return Config_PropManager::integer("Visualization", "shaper_default_transparency") / 100.;
+}
index 0de36c1e24af8ca322a21f3a310043065f64f8ca..7f1c236abb474dc25a51394062dce820cc262cfe 100644 (file)
@@ -297,7 +297,26 @@ public:
                                                FeaturePtr& theCreatedFeature);
 
 
-  static void getFirstAndLastIndexInFolder(const ObjectPtr& theFolder, int& theFirst, int& theLast);
+  static void getFirstAndLastIndexInFolder(const ObjectPtr& theFolder,
+    int& theFirst, int& theLast);
+
+
+  /**
+  * Returns default color value for the given object
+  */
+  static void getDefaultColor(ObjectPtr theObject, const bool isEmptyColorValid,
+    std::vector<int>& theColor);
+
+  /**
+  * Returns default deflection value for the given object
+  */
+  static double getDefaultDeflection(const ObjectPtr& theObject);
+
+
+  /**
+  * Returns default transparency value
+  */
+  static double getDefaultTransparency();
 };
 
 #endif
index 0dde98c1cd3e6756726da8dd72d136848cef31d9..2ba13e6bd49603d358cc91df161154b9997cddb8 100644 (file)
@@ -38,6 +38,7 @@
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_Tools.h>
 #include <ModelAPI_AttributeString.h>
+#include <ModelAPI_Events.h>
 
 #include <ModuleBase_Operation.h>
 #include <ModuleBase_ViewerPrs.h>
@@ -182,9 +183,16 @@ myIsSelection(false)
   connect(aPlaneBtn, SIGNAL(clicked(bool)), SLOT(onChangePlane()));
   aLayout->addWidget(aPlaneBtn);
 
+  aLayout->addSpacing(15);
+
   myDoFLabel = new QLabel("", aSecondWgt);
   aLayout->addWidget(myDoFLabel);
 
+  myShowDOFBtn = new QPushButton(tr("Show remaining DoFs"), aSecondWgt);
+  aLayout->addWidget(myShowDOFBtn);
+  myShowDOFBtn->setEnabled(false);
+  connect(myShowDOFBtn, SIGNAL(clicked(bool)), SLOT(onShowDOF()));
+
   myStackWidget->addWidget(aSecondWgt);
   //setLayout(aLayout);
 
@@ -752,14 +760,29 @@ bool PartSet_WidgetSketchLabel::restoreValueCustom()
         int aDoF = aVal.toInt();
         if (aDoF == 0) {
           myDoFLabel->setText(tr("Sketch is fully fixed (DoF = 0)"));
+          myShowDOFBtn->setEnabled(false);
         } else {
           myDoFLabel->setText(tr("DoF (degrees of freedom) = ") + aVal);
+          myShowDOFBtn->setEnabled(true);
         }
       }
     }
     else {
       myDoFLabel->setText("");
+      myShowDOFBtn->setEnabled(false);
     }
   }
   return true;
 }
+
+
+void PartSet_WidgetSketchLabel::onShowDOF()
+{
+  CompositeFeaturePtr aCompFeature =
+    std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myFeature);
+  if (aCompFeature.get()) {
+    static const Events_ID anEvent = Events_Loop::eventByName(EVENT_GET_DOF_OBJECTS);
+    ModelAPI_EventCreator::get()->sendUpdated(aCompFeature, anEvent);
+    Events_Loop::loop()->flush(anEvent);
+  }
+}
index fe9c147160014b099b18171cdc48c911ffdfcd06..0e19d74701a9568cb0e3fc2ff938b9a76b34a2eb 100644 (file)
@@ -41,6 +41,7 @@ class XGUI_Workshop;
 class QCheckBox;
 class QStackedWidget;
 class QLineEdit;
+class QPushButton;
 
 /**
 * \ingroup Modules
@@ -203,6 +204,8 @@ private slots:
 
   void onChangePlane();
 
+  void onShowDOF();
+
 private:
   /// Set sketch plane by shape
   /// \param theShape a planar face
@@ -235,6 +238,7 @@ private:
   QStackedWidget* myStackWidget;
 
   QLabel* myDoFLabel;
+  QPushButton* myShowDOFBtn;
 
   bool myOpenTransaction;
   bool myIsSelection;
diff --git a/src/PartSet/PartSet_msg_fr.ts b/src/PartSet/PartSet_msg_fr.ts
new file mode 100644 (file)
index 0000000..3d69726
--- /dev/null
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+    <name>PartSet_MenuMgr</name>
+    <message>
+        <location filename="PartSet_MenuMgr.cpp" line="91"/>
+        <location filename="PartSet_MenuMgr.cpp" line="529"/>
+        <source>Auxiliary</source>
+        <translation>Auxiliaire</translation>
+    </message>
+    <message>
+        <location filename="PartSet_MenuMgr.cpp" line="95"/>
+        <location filename="PartSet_MenuMgr.cpp" line="100"/>
+        <source>Activate</source>
+        <translation>Activer</translation>
+    </message>
+    <message>
+        <location filename="PartSet_MenuMgr.cpp" line="104"/>
+        <source>Edit...</source>
+        <translation>Modifier...</translation>
+    </message>
+    <message>
+        <location filename="PartSet_MenuMgr.cpp" line="185"/>
+        <location filename="PartSet_MenuMgr.cpp" line="324"/>
+        <location filename="PartSet_MenuMgr.cpp" line="528"/>
+        <source>Detach</source>
+        <translation>Détacher</translation>
+    </message>
+    <message>
+        <location filename="PartSet_MenuMgr.cpp" line="317"/>
+        <source>Detach %1</source>
+        <translation>Détachez %1</translation>
+    </message>
+</context>
+<context>
+    <name>PartSet_WidgetPoint2D</name>
+    <message>
+        <location filename="PartSet_WidgetPoint2d.cpp" line="118"/>
+        <source>X</source>
+        <translation>X</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetPoint2d.cpp" line="134"/>
+        <source>Y</source>
+        <translation>Y</translation>
+    </message>
+</context>
+<context>
+    <name>PartSet_WidgetSketchCreator</name>
+    <message>
+        <location filename="PartSet_WidgetSketchCreator.cpp" line="91"/>
+        <source>Size of the view</source>
+        <translation>Taille de la vue</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchCreator.cpp" line="546"/>
+        <source>Apply current feature</source>
+        <translation>Appliquer la fonctionnalité actuelle</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchCreator.cpp" line="547"/>
+        <source>Sketch is invalid and will be deleted.
+Error: %1</source>
+        <translation>L&apos;esquisse n&apos;est pas valide et sera supprimée.
+Erreur : %1</translation>
+    </message>
+</context>
+<context>
+    <name>PartSet_WidgetSketchLabel</name>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="106"/>
+        <source>Size of the view</source>
+        <translation>Taille de la vue</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="127"/>
+        <source>Remove external dependencies</source>
+        <translation>Supprimer les dépendances externes</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="141"/>
+        <source>Sketcher plane</source>
+        <translation>Plan du Sketcher</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="144"/>
+        <source>Reversed</source>
+        <translation>Renversé</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="148"/>
+        <source>Set plane view</source>
+        <translation>Définir la vue plane</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="155"/>
+        <source>Show geometrical constraints</source>
+        <translation>Afficher les contraintes géométriques</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="156"/>
+        <source>Show dimensional constraints</source>
+        <translation>Afficher les contraintes dimensionnelles</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="157"/>
+        <source>Show existing expressions</source>
+        <translation>Afficher les expressions existantes</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="172"/>
+        <source>Show free points</source>
+        <translation>Afficher les points libres</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="176"/>
+        <source>Automatic constraints</source>
+        <translation>Contraintes automatiques</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="177"/>
+        <source>Automatic vertical and horizontal constraints</source>
+        <translation>Automatique des contraintes verticales et horizontales</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="181"/>
+        <source>Change sketch plane</source>
+        <translation>Changer le plan d&apos;esquisse</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="753"/>
+        <source>Sketch is fully fixed (DoF = 0)</source>
+        <translation>L&apos;esquisse est entièrement fixée (DdL = 0)</translation>
+    </message>
+    <message>
+        <location filename="PartSet_WidgetSketchLabel.cpp" line="755"/>
+        <source>DoF (degrees of freedom) = </source>
+        <translation>DdL (degrés de liberté) = </translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="PartSet_TreeNodes.cpp" line="402"/>
+        <source>Parameters</source>
+        <translation>Paramètres</translation>
+    </message>
+    <message>
+        <location filename="PartSet_TreeNodes.cpp" line="404"/>
+        <source>Constructions</source>
+        <translation>Constructions</translation>
+    </message>
+    <message>
+        <location filename="PartSet_TreeNodes.cpp" line="406"/>
+        <source>Parts</source>
+        <translation>Pièces</translation>
+    </message>
+    <message>
+        <location filename="PartSet_TreeNodes.cpp" line="408"/>
+        <source>Results</source>
+        <translation>Résultats</translation>
+    </message>
+    <message>
+        <location filename="PartSet_TreeNodes.cpp" line="410"/>
+        <source>Fields</source>
+        <translation>Champs</translation>
+    </message>
+    <message>
+        <location filename="PartSet_TreeNodes.cpp" line="412"/>
+        <source>Groups</source>
+        <translation>Groupes</translation>
+    </message>
+</context>
+</TS>
index 068f1781b4face1367945f2b1858fcf258191dbd..9b3079ba32f5f97bceafc82e75bae368bf07ae22 100644 (file)
@@ -39,7 +39,7 @@ SET(XML_RESOURCES
 )
 
 SET(TEXT_RESOURCES
-#    PartSetPlugin_msg_fr.ts
+    PartSetPlugin_msg_fr.ts
 )
 
 SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
diff --git a/src/PartSetPlugin/PartSetPlugin_msg_fr.ts b/src/PartSetPlugin/PartSetPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..2e5579c
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Part</source>
+      <translation>Pièce</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Duplicate</name>
+    <message>
+      <source>Duplicate active part</source>
+      <translation>Dupliquer la pièce active</translation>
+    </message>
+    <message>
+      <source>Duplicate part</source>
+      <translation>Dupliquer pièce</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Part</name>
+    <message>
+      <source>Create part</source>
+      <translation>Créer une pièce</translation>
+    </message>
+    <message>
+      <source>New part</source>
+      <translation>Nouvelle pièce</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Remove</name>
+    <message>
+      <source>Remove active part</source>
+      <translation>Supprimer la pièce active</translation>
+    </message>
+    <message>
+      <source>Remove part</source>
+      <translation>Supprimer une partie</translation>
+    </message>
+  </context>
+
+</TS>
index 244061636257a252dcf9b87a9bf89ba7f5d99e8d..abc07fbac28a56c08e93093c374c84372768d538 100644 (file)
@@ -46,7 +46,7 @@ SET(XML_RESOURCES
 )
 
 SET(TEXT_RESOURCES
-#    PrimitivesPlugin_msg_fr.ts
+    PrimitivesPlugin_msg_fr.ts
 )
 
 SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
diff --git a/src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts b/src/PrimitivesPlugin/PrimitivesPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..d53345e
--- /dev/null
@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Primitives</source>
+      <translation>Primitives</translation>
+    </message>
+    <message>
+      <source>Box</source>
+      <translation>Boîte</translation>
+    </message>
+    <message>
+      <source>Cone</source>
+      <translation>Cône</translation>
+    </message>
+    <message>
+      <source>Cylinder</source>
+      <translation>Cylindre</translation>
+    </message>
+    <message>
+      <source>Sphere</source>
+      <translation>Sphère</translation>
+    </message>
+    <message>
+      <source>Torus</source>
+      <translation>Tore</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Box</name>
+    <message>
+      <source>Box</source>
+      <translation>Boîte</translation>
+    </message>
+    <message>
+      <source>Create a box</source>
+      <translation>Créer une boîte</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:CreationMethod</name>
+    <message>
+      <source>By dimensions</source>
+      <translation>Par dimensions</translation>
+    </message>
+    <message>
+      <source>By two points</source>
+      <translation>Par deux points</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:FirstPoint</name>
+    <message>
+      <source>First point</source>
+      <translation>Premier point</translation>
+    </message>
+    <message>
+      <source>Select a first point</source>
+      <translation>Sélectionnez un premier point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:FirstPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un premier point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:SecondPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un deuxième point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:SecondPoint</name>
+    <message>
+      <source>Second point</source>
+      <translation>Deuxième point</translation>
+    </message>
+    <message>
+      <source>Select a second point</source>
+      <translation>Sélectionnez un deuxième point</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:dx</name>
+    <message>
+      <source>DX</source>
+      <translation>DX</translation>
+    </message>
+    <message>
+      <source>Dimension in X</source>
+      <translation>Dimension en X</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:dy</name>
+    <message>
+      <source>DY</source>
+      <translation>DY</translation>
+    </message>
+    <message>
+      <source>Dimension in Y</source>
+      <translation>Dimension en Y</translation>
+    </message>
+  </context>
+  <context>
+    <name>Box:dz</name>
+    <message>
+      <source>DZ</source>
+      <translation>DZ</translation>
+    </message>
+    <message>
+      <source>Dimension in Z</source>
+      <translation>Dimension en Z</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Cone</name>
+    <message>
+      <source>Cone</source>
+      <translation>Cône</translation>
+    </message>
+    <message>
+      <source>Create a Cone</source>
+      <translation>Créer un cône</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cone:axis</name>
+    <message>
+      <source>Select the axis of the cone</source>
+      <translation>Sélectionnez l&apos;axe du cône</translation>
+    </message>
+    <message>
+      <source>axis</source>
+      <translation>axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cone:base_point</name>
+    <message>
+      <source>Select the center of the base of the cone</source>
+      <translation>Sélectionnez le centre de la base du cône</translation>
+    </message>
+    <message>
+      <source>base_point</source>
+      <translation>point de base</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cone:base_radius</name>
+    <message>
+      <source>Base radius</source>
+      <translation>Rayon de la base</translation>
+    </message>
+    <message>
+      <source>Enter the base radius of the cone</source>
+      <translation>Entrez le rayon de base du cône</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cone:height</name>
+    <message>
+      <source>Enter the height of the cone</source>
+      <translation>Entrez la hauteur du cône</translation>
+    </message>
+    <message>
+      <source>height</source>
+      <translation>hauteur</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cone:top_radius</name>
+    <message>
+      <source>Enter the top radius of the cone</source>
+      <translation>Entrez le rayon supérieur du cône</translation>
+    </message>
+    <message>
+      <source>Top radius</source>
+      <translation>Rayon supérieur</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cone:base_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le centre de la base du cône.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cone:base_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Cylinder</name>
+    <message>
+      <source>Create a cylinder</source>
+      <translation>Créer un cylindre</translation>
+    </message>
+    <message>
+      <source>Cylinder</source>
+      <translation>Cylindre</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:CreationMethod</name>
+    <message>
+      <source>Cylinder</source>
+      <translation>Cylindre</translation>
+    </message>
+    <message>
+      <source>Portion of cylinder</source>
+      <translation>Portion de cylindre</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:angle</name>
+    <message>
+      <source>Enter the angle of the portion of the cylinder</source>
+      <translation>Entrez l&apos;angle de la portion du cylindre</translation>
+    </message>
+    <message>
+      <source>angle</source>
+      <translation>angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:axis</name>
+    <message>
+      <source>Select the axis of the cylinder</source>
+      <translation>Sélectionnez l&apos;axe du cylindre</translation>
+    </message>
+    <message>
+      <source>axis</source>
+      <translation>axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:base_point</name>
+    <message>
+      <source>Select the center of the base of the cylinder</source>
+      <translation>Sélectionnez le centre de la base du cylindre</translation>
+    </message>
+    <message>
+      <source>base_point</source>
+      <translation>point de base</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:height</name>
+    <message>
+      <source>Enter the height of the cylinder</source>
+      <translation>Entrez la hauteur du cylindre</translation>
+    </message>
+    <message>
+      <source>height</source>
+      <translation>hauteur</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:radius</name>
+    <message>
+      <source>Enter the radius of the cylinder</source>
+      <translation>Entrez le rayon du cylindre</translation>
+    </message>
+    <message>
+      <source>radius</source>
+      <translation>rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:base_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le centre de la base du cylindre.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Cylinder:base_point:GeomValidators_ConstructionComposite</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le résultat est vide</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Sphere</name>
+    <message>
+      <source>Create a sphere</source>
+      <translation>Créer une sphère</translation>
+    </message>
+    <message>
+      <source>Sphere</source>
+      <translation>Sphère</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:center_point</name>
+    <message>
+      <source>Center point</source>
+      <translation>Point central</translation>
+    </message>
+    <message>
+      <source>Select a center point</source>
+      <translation>Sélectionnez un point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sphere:radius</name>
+    <message>
+      <source>Enter a radius</source>
+      <translation>Entrez un rayon</translation>
+    </message>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Torus</name>
+    <message>
+      <source>Create a Torus</source>
+      <translation>Créer un tore</translation>
+    </message>
+    <message>
+      <source>Torus</source>
+      <translation>Tore</translation>
+    </message>
+  </context>
+  <context>
+    <name>Torus:axis</name>
+    <message>
+      <source>Select the axis of the torus</source>
+      <translation>Sélectionnez l&apos;axe du tore</translation>
+    </message>
+    <message>
+      <source>axis</source>
+      <translation>axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>Torus:base_point</name>
+    <message>
+      <source>Select the center of the torus</source>
+      <translation>Sélectionnez le centre du tore</translation>
+    </message>
+    <message>
+      <source>base_point</source>
+      <translation>point de base</translation>
+    </message>
+  </context>
+  <context>
+    <name>Torus:radius</name>
+    <message>
+      <source>Enter the radius of the torus</source>
+      <translation>Entrez le rayon du tore</translation>
+    </message>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>Torus:ring_radius</name>
+    <message>
+      <source>Enter the ring radius of the torus</source>
+      <translation>Entrez le rayon de l&apos;anneau du tore</translation>
+    </message>
+    <message>
+      <source>Ring radius</source>
+      <translation>Rayon de l&apos;anneau</translation>
+    </message>
+  </context>
+
+</TS>
index 2360f5844cbe26f3a5433bba857653654273183d..e15c9080c9f5b028e2887b0d013c841fed6efe5b 100644 (file)
@@ -64,7 +64,7 @@ SET(PROJECT_RESOURCES
 )
 
 SET(TEXT_RESOURCES
-#    SHAPERGUI_msg_fr.ts
+    SHAPERGUI_msg_fr.ts
 )
 
 IF (${UPDATE_TRANSLATION})
@@ -75,7 +75,9 @@ IF (${UPDATE_TRANSLATION})
                            OPTIONS -extensions cpp -no-recursive
                           )
 ELSE(${UPDATE_TRANSLATION})
-    QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    IF(${MAKE_TRANSLATION})
+        QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    ENDIF(${MAKE_TRANSLATION})
 ENDIF(${UPDATE_TRANSLATION})
 
 
diff --git a/src/SHAPERGUI/SHAPERGUI_msg_fr.ts b/src/SHAPERGUI/SHAPERGUI_msg_fr.ts
new file mode 100644 (file)
index 0000000..243a717
--- /dev/null
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+  <context>
+    <name>SHAPERGUI</name>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="170"/>
+      <source>Inspection</source>
+      <translation>Inspection</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="171"/>
+      <source>Information</source>
+      <translation>Information</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="176"/>
+      <source>Show inspection window</source>
+      <translation>Afficher la fenêtre d&apos;inspection</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="177"/>
+      <source>What Is</source>
+      <translation>Qu’est-ce que c’est</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="183"/>
+      <source>Inspection tool</source>
+      <translation>Outil d&apos;inspection</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="191"/>
+      <source>Edit toolbars of the module</source>
+      <translation>Editer les barres d&apos;outils du module</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="193"/>
+      <source>Edit toolbars...</source>
+      <translation>Editer les barres d&apos;outils...</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="775"/>
+      <source>Viewer</source>
+      <translation>Vue</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="777"/>
+      <source>Default selection</source>
+      <translation>Sélection par défaut</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="779"/>
+      <source>Faces</source>
+      <translation>Faces</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="782"/>
+      <source>Edges</source>
+      <translation>Arêtes</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="785"/>
+      <source>Vertices</source>
+      <translation>Sommets</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="789"/>
+      <source>Selection sensitivity</source>
+      <translation>Sensibilité de sélection</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="791"/>
+      <source>Vertex</source>
+      <translation>Sommet</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="793"/>
+      <source>Edge</source>
+      <translation>Bord</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="796"/>
+      <source>Additional highlighting</source>
+      <translation>Mise en évidence supplémentaire</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="798"/>
+      <source>In 3d mode</source>
+      <translation>En mode 3D</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="800"/>
+      <source>In 2d mode</source>
+      <translation>En mode 2D</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="803"/>
+      <source>Color scale</source>
+      <translation>Échelle de couleur</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="805"/>
+      <source>X position</source>
+      <translation>Position X</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="810"/>
+      <source>Y position</source>
+      <translation>Position Y</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="815"/>
+      <source>Width</source>
+      <translation>Largeur</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="820"/>
+      <source>Height</source>
+      <translation>Hauteur</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="825"/>
+      <source>Intervals number</source>
+      <translation>Nombre d&apos;intervalles</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="830"/>
+      <source>Text height</source>
+      <translation>Hauteur du texte</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI.cpp" line="835"/>
+      <source>Text color</source>
+      <translation>Couleur du texte</translation>
+    </message>
+  </context>
+  <context>
+    <name>SHAPERGUI_ToolbarItemsDlg</name>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="268"/>
+      <source>Edit toolbar</source>
+      <translation>Editer la barre d&apos;outils</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="278"/>
+      <source>Toolbar name:</source>
+      <translation>Nom de la barre d&apos;outils:</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="298"/>
+      <source>Out of toolbars:</source>
+      <translation>Hors des barres d&apos;outils:</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="333"/>
+      <source>In the toolbar:</source>
+      <translation>Dans la barre d&apos;outils:</translation>
+    </message>
+  </context>
+  <context>
+    <name>SHAPERGUI_ToolbarsDlg</name>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="88"/>
+      <source>Toolbars</source>
+      <translation>Barres d&apos;outils</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="103"/>
+      <source>Toolbars:</source>
+      <translation>Barres d&apos;outils:</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="115"/>
+      <source>Number of commands out of toolbars:</source>
+      <translation>Nombre de commandes hors des barres d&apos;outils:</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="125"/>
+      <source>Add...</source>
+      <translation>Ajouter...</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="126"/>
+      <source>Add a new empty toolbar to the toolbars list</source>
+      <translation>Ajouter une nouvelle barre d&apos;outils vide à la liste des barres d&apos;outils</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="130"/>
+      <source>Edit...</source>
+      <translation>Modifier...</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="131"/>
+      <source>Edit currently selected toolbar</source>
+      <translation>Modifier la barre d&apos;outils actuellement sélectionnée</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="135"/>
+      <source>Delete</source>
+      <translation>Effacer</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="136"/>
+      <source>Delete currently selected toolbar</source>
+      <translation>Supprimer la barre d&apos;outils actuellement sélectionnée</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="141"/>
+      <source>Reset</source>
+      <translation>Réinitialiser</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="142"/>
+      <source>Restore default toolbars structure</source>
+      <translation>Restaurer la structure des barres d&apos;outils par défaut</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="163"/>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="172"/>
+      <source>Create toolbar</source>
+      <translation>Créer une barre d&apos;outils</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="163"/>
+      <source>Name of a new toolbar</source>
+      <translation>Nom d&apos;une nouvelle barre d&apos;outils</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="171"/>
+      <source>A tool bar with name %1 already exists</source>
+      <translation>Une barre d&apos;outils portant le nom %1 existe déjà</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="205"/>
+      <source>Toolbar %1 will be deleted. Continue?</source>
+      <translation>La barre d&apos;outils %1 sera supprimée. Continuez ?</translation>
+    </message>
+    <message>
+      <location filename="SHAPERGUI_ToolbarsMgr.cpp" line="206"/>
+      <source>Delete toolbar</source>
+      <translation>Supprimer la barre d&apos;outils</translation>
+    </message>
+  </context>
+</TS>
index 0504e411d9daccf4e2251f6d8ce4e63faaf879a8..b2ca766988edd68862c7c6894ec35672e5de608e 100644 (file)
@@ -1146,10 +1146,13 @@ static std::shared_ptr<GeomAPI_Pnt2d> middlePointOnArc(const FeaturePtr& theFeat
   return std::shared_ptr<GeomAPI_Pnt2d>(new GeomAPI_Pnt2d(x, y));
 }
 
-static std::shared_ptr<GeomAPI_Pnt2d> pointOnEllipse(const FeaturePtr& theFeature)
+static std::shared_ptr<GeomAPI_Pnt2d> pointOnEllipse(const FeaturePtr& theFeature,
+                                                     bool isEllipse = true)
 {
+  const std::string& anAttrName = isEllipse ? SketchPlugin_Ellipse::MAJOR_AXIS_END_ID() :
+                                  SketchPlugin_EllipticArc::MAJOR_AXIS_END_ID();
   AttributePoint2DPtr aMajorAxisEnd = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
-      theFeature->attribute(SketchPlugin_Ellipse::MAJOR_AXIS_END_ID()));
+      theFeature->attribute(anAttrName));
   return aMajorAxisEnd ? aMajorAxisEnd->pnt() : std::shared_ptr<GeomAPI_Pnt2d>();
 }
 
@@ -1170,6 +1173,8 @@ static std::shared_ptr<GeomAPI_Pnt2d> middlePoint(const ObjectPtr& theObject)
       aMiddlePoint = middlePointOnArc(aFeature);
     else if (aFeatureKind == SketchPlugin_Ellipse::ID())
       aMiddlePoint = pointOnEllipse(aFeature);
+    else if (aFeatureKind == SketchPlugin_EllipticArc::ID())
+      aMiddlePoint = pointOnEllipse(aFeature, false);
   }
   return aMiddlePoint;
 }
index d32b708caa6481d26549c66ec3a3b34e1c824351..eafb7949e2b98189c3058555c3768378628342fd 100644 (file)
@@ -136,6 +136,7 @@ SET(XML_RESOURCES
 
 SET(TEXT_RESOURCES
        SketchPlugin_msg_en.ts
+       SketchPlugin_msg_fr.ts
 )
 
 SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
@@ -283,6 +284,7 @@ ADD_UNIT_TESTS(
   TestProjectionIntoResult.py
   TestProjectionUpdate.py
   TestRectangle.py
+  TestRemainingDoF.py
   TestRemoveEllipse.py
   TestRemoveEllipticArc.py
   TestRemoveSketch.py
@@ -322,6 +324,7 @@ if(${SKETCHER_CHANGE_RADIUS_WHEN_MOVE})
     TestMoveArc.py
     TestMoveCircle.py
     TestMoveEllipse.py
+    TestMoveEllipticArc.py
     TestMoveLine.py
     TestMovementComplex.py
     TestMovePoint.py
index b856543b3921c3ca51a3eb9f7213912b4fddd554..137acd0cdebab5ef7d9d51b737bba25ce6fd5d6f 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "SketchPlugin_ConstraintAngle.h"
 #include <SketchPlugin_Line.h>
+#include <SketchPlugin_Tools.h>
 #include <SketcherPrs_Tools.h>
 
 #include <ModelAPI_AttributeDouble.h>
@@ -117,6 +118,8 @@ AISObjectPtr SketchPlugin_ConstraintAngle::getAISObject(AISObjectPtr thePrevious
 
   AISObjectPtr anAIS = SketcherPrs_Factory::angleConstraint(this, sketch(),
                                                             thePrevious);
+  if (anAIS.get() && !thePrevious.get())
+    SketchPlugin_Tools::setDimensionColor(anAIS);
   return anAIS;
 }
 
index 16a0451d4044c1987e970bf4b56adea306ed4e8a..391c1016234ecb1702b235963af676b10f31544e 100644 (file)
@@ -21,6 +21,7 @@
 #include <SketchPlugin_Point.h>
 #include <SketchPlugin_Circle.h>
 #include <SketchPlugin_Line.h>
+#include <SketchPlugin_Tools.h>
 
 #include <SketcherPrs_Tools.h>
 #include <SketcherPrs_Factory.h>
@@ -95,6 +96,8 @@ AISObjectPtr SketchPlugin_ConstraintDistance::getAISObject(AISObjectPtr thePrevi
   AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this,
                                                                       sketch(),
                                                                       thePrevious);
+  if (anAIS.get() && !thePrevious.get())
+    SketchPlugin_Tools::setDimensionColor(anAIS);
   return anAIS;
 }
 
index 3357d5819f52c9e97f0d48dd055a097894243242..bd45029bafd3d17f65b1185a07f45b8d6af34fbe 100644 (file)
@@ -22,6 +22,7 @@
 // Author:  Artem ZHIDKOV
 
 #include <SketchPlugin_ConstraintDistanceAlongDir.h>
+#include <SketchPlugin_Tools.h>
 
 #include <SketcherPrs_Tools.h>
 #include <SketcherPrs_Factory.h>
@@ -84,6 +85,8 @@ AISObjectPtr SketchPlugin_ConstraintDistanceAlongDir::getAISObject(AISObjectPtr
   AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this,
                                                                       sketch(),
                                                                       thePrevious);
+  if (anAIS.get() && !thePrevious.get())
+    SketchPlugin_Tools::setDimensionColor(anAIS);
   return anAIS;
 }
 
index 1ba4aa081ff9e54a91a7af1b61fb40fd824aa74a..ad6ee92b540721d4df98d217917d2eee2c9efc47 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "SketchPlugin_ConstraintLength.h"
 #include <SketchPlugin_Line.h>
+#include <SketchPlugin_Tools.h>
 
 #include <GeomDataAPI_Point2D.h>
 
@@ -171,6 +172,8 @@ AISObjectPtr SketchPlugin_ConstraintLength::getAISObject(AISObjectPtr thePreviou
 
   AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this,
     sketch(), thePrevious);
+  if (anAIS.get() && !thePrevious.get())
+    SketchPlugin_Tools::setDimensionColor(anAIS);
   return anAIS;
 }
 
index b27190e0a556f406ca0325e778b407da433d139c..a58609b2dcc64e814effe66c84f71c77367e46c6 100644 (file)
@@ -22,6 +22,7 @@
 #include <SketchPlugin_Arc.h>
 #include <SketchPlugin_Circle.h>
 #include <SketchPlugin_Point.h>
+#include <SketchPlugin_Tools.h>
 
 #include <SketcherPrs_Factory.h>
 #include <SketcherPrs_Tools.h>
@@ -177,6 +178,8 @@ AISObjectPtr SketchPlugin_ConstraintRadius::getAISObject(AISObjectPtr thePreviou
 
   AISObjectPtr anAIS = SketcherPrs_Factory::radiusConstraint(this, sketch(),
                                                              thePrevious);
+  if (anAIS.get() && !thePrevious.get())
+    SketchPlugin_Tools::setDimensionColor(anAIS);
   return anAIS;
 }
 
index e076f47c2454d2b1ba6081c6dc91f7fb6e9b8f43..9507cad1a9970b0b557863383d559d498b114031 100644 (file)
@@ -193,6 +193,11 @@ AISObjectPtr SketchPlugin_Fillet::getAISObject(AISObjectPtr thePrevious)
     anAISObject = AISObjectPtr(new GeomAPI_AISObject);
   }
   anAISObject->createShape(anArcShape);
+  bool isAxiliary = false;
+  AttributeBooleanPtr aAttr = boolean(AUXILIARY_ID());
+  if (aAttr.get())
+    isAxiliary = aAttr->value();
+  SketchPlugin_Tools::customizeFeaturePrs(anAISObject, isAxiliary);
   return anAISObject;
 }
 
index ecd064a088075dc90bfae63f75d5d668602ce888..ed2caaf650386a1d4079a0e5ffab1be0bd22c0cf 100644 (file)
@@ -302,6 +302,7 @@ AISObjectPtr SketchPlugin_MacroArc::getAISObject(AISObjectPtr thePrevious)
     anAIS.reset(new GeomAPI_AISObject());
   }
   anAIS->createShape(aCompound);
+  SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
   return anAIS;
 }
 
index 0bcabf4ff4731a90b7d26c7f2f34fffe07ca4cc9..7a0572702e263fd4c8d020120995af46bc7a3fc8 100644 (file)
@@ -389,6 +389,10 @@ AISObjectPtr SketchPlugin_MacroCircle::getAISObject(AISObjectPtr thePrevious)
     anAIS.reset(new GeomAPI_AISObject());
   }
   anAIS->createShape(aCompound);
+
+  // Modify attributes
+  SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
+
   return anAIS;
 }
 
index e1e79e3aedac61736e6a65b37a920ec6cba00d3e..2cf1cbc7f011bcf9ff4c7a6e314d46c57f395705 100644 (file)
@@ -380,5 +380,9 @@ AISObjectPtr SketchPlugin_MacroEllipse::getAISObject(AISObjectPtr thePrevious)
   if (!anAIS)
     anAIS.reset(new GeomAPI_AISObject());
   anAIS->createShape(aCompound);
+
+  // Modify attributes
+  SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
+
   return anAIS;
 }
index 984a759261cd1ace2416455d69f18a2531452b50..bd8290c0c5db33c4d749befe5146c0bfb09049a9 100644 (file)
@@ -350,6 +350,7 @@ AISObjectPtr SketchPlugin_MacroEllipticArc::getAISObject(AISObjectPtr thePreviou
   if (!anAIS)
     anAIS.reset(new GeomAPI_AISObject());
   anAIS->createShape(aCompound);
+  SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
   return anAIS;
 }
 
index d9e967e60a7e7f07a18eea5fba7f0de76e47a31d..ac1b442c82da8b06b32c948a929aaa7427cbc7c4 100644 (file)
@@ -171,6 +171,10 @@ SketchPlugin_Plugin::SketchPlugin_Plugin()
                                    "Sketch fully constrained color",
                                    Config_Prop::Color, SKETCH_FULLY_CONSTRAINED_COLOR);
 
+  Config_PropManager::registerProp("Visualization", "sketch_line_width",
+                                   "Sketch line width",
+                                   Config_Prop::IntSpin, "3");
+
   // register sketcher properties
 #ifdef SET_PLANES_COLOR_IN_PREFERENCES
   Config_PropManager::registerProp("Visualization", "yz_plane_color", "YZ plane color",
index 79eb675ca240ca273480dd8d6d4c92ed3b8f08d9..e04031fee6db7cee731dd447ce225900018759b9 100644 (file)
@@ -35,6 +35,9 @@
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Validator.h>
 #include <ModelAPI_Tools.h>
+#include <ModelAPI_Events.h>
+
+#include <Events_Loop.h>
 
 #include <GeomAPI_Circ.h>
 #include <GeomAPI_Edge.h>
@@ -51,6 +54,7 @@
 
 static const double tolerance = 1.e-7;
 
+
 SketchPlugin_Projection::SketchPlugin_Projection()
     : SketchPlugin_SketchEntity(),
       myIsComputing(false)
@@ -371,6 +375,9 @@ void SketchPlugin_Projection::computeProjection(const std::string& theID)
       setResult(aResult);
       GeomShapePtr anEmptyVal;
       aProjection->selection(EXTERNAL_ID())->setValue(lastResult(), anEmptyVal);
+
+      static const Events_ID anEvent = Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES);
+      ModelAPI_EventCreator::get()->sendUpdated(aProjection, anEvent, false);
     }
   }
 }
index 7f63c5bb2ca4643eee898b0878d9ba81f3528389..6feda008dd89d3a607d48306566c0f362184592f 100644 (file)
@@ -43,7 +43,7 @@
  * \ingroup Plugins
  * \brief Feature for creation of the new part in PartSet.
  */
-class SketchPlugin_Sketch : public ModelAPI_CompositeFeature, public GeomAPI_ICustomPrs
+class SketchPlugin_Sketch : public ModelAPI_CompositeFeature//, public GeomAPI_ICustomPrs
 {
  public:
   /// Sketch feature kind
@@ -257,18 +257,18 @@ class SketchPlugin_Sketch : public ModelAPI_CompositeFeature, public GeomAPI_ICu
   static std::shared_ptr<GeomAPI_Ax3> plane(SketchPlugin_Sketch* theSketch);
 
   /// Customize presentation of the feature
-  virtual bool customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
-                                     std::shared_ptr<GeomAPI_ICustomPrs> theDefaultPrs)
-  {
-    bool isCustomized = false;
-    // apply the color of the result to the presentation
-    if (theDefaultPrs.get())
-      isCustomized = theDefaultPrs->customisePresentation(theResult, thePrs, theDefaultPrs);
-    // set the sketch presentation bold
-    isCustomized = thePrs->setWidth(2) || isCustomized;
-
-    return isCustomized;
-  }
+  //virtual bool customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
+  //                                   std::shared_ptr<GeomAPI_ICustomPrs> theDefaultPrs)
+  //{
+  //  bool isCustomized = false;
+  //  // apply the color of the result to the presentation
+  //  if (theDefaultPrs.get())
+  //    isCustomized = theDefaultPrs->customisePresentation(theResult, thePrs, theDefaultPrs);
+  //  // set the sketch presentation bold
+  //  isCustomized = thePrs->setWidth(2) || isCustomized;
+
+  //  return isCustomized;
+  //}
 
 private:
   /// Substitute all links to external objects by newly created features.
index 0f653e4196f5122b60f21553e0ee2c0325b00d01..b181565a7bc1f633b6b300c1d787c687ed749f68 100644 (file)
@@ -41,7 +41,7 @@
  * This is an abstract class to give
  * an interface to create the entity features such as line, circle, arc and point.
  */
-class SketchPlugin_SketchEntity : public SketchPlugin_Feature, public GeomAPI_ICustomPrs
+class SketchPlugin_SketchEntity : public SketchPlugin_Feature //, public GeomAPI_ICustomPrs
 {
  public:
   /// Reference to the construction type of the feature
@@ -73,15 +73,15 @@ class SketchPlugin_SketchEntity : public SketchPlugin_Feature, public GeomAPI_IC
   }
 
   /// Width of the auxiliary line
-  inline static const double SKETCH_LINE_WIDTH_AUXILIARY()
+  inline static const int SKETCH_LINE_WIDTH_AUXILIARY()
   {
     return 2;
   }
 
   /// Width of the line
-  inline static const double SKETCH_LINE_WIDTH()
+  inline static const int SKETCH_LINE_WIDTH()
   {
-    return 3;
+    return Config_PropManager::integer("Visualization", "sketch_line_width");
   }
 
   /// Style of the auxiliary line
@@ -118,87 +118,105 @@ class SketchPlugin_SketchEntity : public SketchPlugin_Feature, public GeomAPI_IC
     return false;
   }
 
+  //virtual bool isIncludeToResult() const
+  //{
+  //  AttributeBooleanPtr anAttr;
+  //  std::set<AttributePtr> aRefsToMe = data()->refsToMe();
+  //  std::set<AttributePtr>::const_iterator aIt;
+  //  for (aIt = aRefsToMe.cbegin(); aIt != aRefsToMe.cend(); ++aIt) {
+  //    if ((*aIt)->id() == "ProjectedFeature") {
+  //      FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>((*aIt)->owner());
+  //      if (aFeature.get()) {
+  //        anAttr = aFeature->data()->boolean("IncludeToResult");
+  //        if (anAttr.get())
+  //          return anAttr->value();
+  //      }
+  //    }
+  //  }
+  //  return true;
+  //}
+
 // LCOV_EXCL_START
   /// Customize presentation of the feature
-  virtual bool customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
-                                     std::shared_ptr<GeomAPI_ICustomPrs> theDefaultPrs)
-  {
-    /// Store previous color values of the presentation to check it after setting specific entity
-    /// color. Default color is set into presentation to have not modified isCustomized state
-    /// after default customize prs is completed.
-    std::vector<int> aPrevColor;
-    aPrevColor.resize(3);
-    thePrs->getColor(aPrevColor[0], aPrevColor[1], aPrevColor[2]);
-    if (theResult.get()) {
-      std::string aSection, aName, aDefault;
-      theResult->colorConfigInfo(aSection, aName, aDefault);
-      std::vector<int> aColor;
-      aColor = Config_PropManager::color(aSection, aName);
-      thePrs->setColor(aColor[0], aColor[1], aColor[2]);
-    }
-
-    bool isCustomized = theDefaultPrs.get() != NULL &&
-                        theDefaultPrs->customisePresentation(theResult, thePrs, theDefaultPrs);
-    int aShapeType = thePrs->getShapeType();
-    // a compound is processed like the edge because the
-    // arc feature uses the compound for presentable AIS
-    if (aShapeType != 6/*an edge*/ && aShapeType != 7/*a vertex*/ && aShapeType != 0/*compound*/)
-      return false;
-
-    // set color from preferences
-    std::vector<int> aColor;
-    std::shared_ptr<ModelAPI_AttributeBoolean> anAuxiliaryAttr =
-                                    data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
-    bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
-    if (isConstruction) {
-      aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color");
-    }
-    else if (isExternal()) {
-      aColor = Config_PropManager::color("Visualization", "sketch_external_color");
-    }
-    else {
-      aColor = Config_PropManager::color("Visualization", "sketch_entity_color");
-    }
-    if (!aColor.empty()) {
-      if (theResult.get() && ModelAPI_Session::get()->isOperation()) {
-        AttributeIntArrayPtr aColorAttr = theResult->data()->intArray(ModelAPI_Result::COLOR_ID());
-        aColorAttr->setSize(3);
-        // Set the color attribute in order do not use default colors in the presentation object
-        for (int i = 0; i < 3; i++)
-          aColorAttr->setValue(i, aColor[i]);
-      }
-      thePrs->setColor(aColor[0], aColor[1], aColor[2]);
-      for (int i = 0; i < 3 && !isCustomized; i++)
-        isCustomized = aColor[i] != aPrevColor[i];
-    }
-
-    if (aShapeType == 6 || aShapeType == 0) { // if this is an edge or a compound
-      if (isConstruction) {
-        isCustomized = thePrs->setWidth(SKETCH_LINE_WIDTH_AUXILIARY()) || isCustomized;
-        isCustomized = thePrs->setLineStyle(SKETCH_LINE_STYLE_AUXILIARY()) || isCustomized;
-      }
-      else {
-        isCustomized = thePrs->setWidth(SKETCH_LINE_WIDTH()) || isCustomized;
-        isCustomized = thePrs->setLineStyle(SKETCH_LINE_STYLE()) || isCustomized;
-      }
-    }
-    else if (aShapeType == 7) { // otherwise this is a vertex
-      // The width value do not have effect on the point presentation.
-      // It is defined in order to extend selection area of the object.
-      thePrs->setWidth(17);
-    //  thePrs->setPointMarker(1, 1.); // Set point as a '+' symbol
-    }
-    if(isCopy()) {
-      double aWidth = thePrs->width();
-      isCustomized = thePrs->setWidth(aWidth / 2.5) || isCustomized;
-    }
-
-    if (!theResult.get()) {
-      double aDeflection = Config_PropManager::real("Visualization", "construction_deflection");
-      thePrs->setDeflection(aDeflection);
-    }
-    return isCustomized;
-  }
+  //virtual bool customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
+  //                                   std::shared_ptr<GeomAPI_ICustomPrs> theDefaultPrs)
+  //{
+  //  /// Store previous color values of the presentation to check it after setting specific entity
+  //  /// color. Default color is set into presentation to have not modified isCustomized state
+  //  /// after default customize prs is completed.
+  //  std::vector<int> aPrevColor;
+  //  aPrevColor.resize(3);
+  //  thePrs->getColor(aPrevColor[0], aPrevColor[1], aPrevColor[2]);
+  //  if (theResult.get()) {
+  //    std::string aSection, aName, aDefault;
+  //    theResult->colorConfigInfo(aSection, aName, aDefault);
+  //    std::vector<int> aColor;
+  //    aColor = Config_PropManager::color(aSection, aName);
+  //    thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+  //  }
+
+  //  bool isCustomized = theDefaultPrs.get() != NULL &&
+  //                      theDefaultPrs->customisePresentation(theResult, thePrs, theDefaultPrs);
+  //  int aShapeType = thePrs->getShapeType();
+  //  // a compound is processed like the edge because the
+  //  // arc feature uses the compound for presentable AIS
+  //  if (aShapeType != 6/*an edge*/ && aShapeType != 7/*a vertex*/ && aShapeType != 0/*compound*/)
+  //    return false;
+
+  //  // set color from preferences
+  //  std::vector<int> aColor;
+  //  std::shared_ptr<ModelAPI_AttributeBoolean> anAuxiliaryAttr =
+  //                                  data()->boolean(SketchPlugin_SketchEntity::AUXILIARY_ID());
+  //  bool isConstruction = anAuxiliaryAttr.get() != NULL && anAuxiliaryAttr->value();
+  //  if (isConstruction) {
+  //    aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color");
+  //  }
+  //  else if (isExternal()) {
+  //    aColor = Config_PropManager::color("Visualization", "sketch_external_color");
+  //  }
+  //  else {
+  //    aColor = Config_PropManager::color("Visualization", "sketch_entity_color");
+  //  }
+  //  if (!aColor.empty()) {
+  //    if (theResult.get() && ModelAPI_Session::get()->isOperation()) {
+  //      AttributeIntArrayPtr aColorAttr = theResult->data()->intArray(ModelAPI_Result::COLOR_ID());
+  //      aColorAttr->setSize(3);
+  //      // Set the color attribute in order do not use default colors in the presentation object
+  //      for (int i = 0; i < 3; i++)
+  //        aColorAttr->setValue(i, aColor[i]);
+  //    }
+  //    thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+  //    for (int i = 0; i < 3 && !isCustomized; i++)
+  //      isCustomized = aColor[i] != aPrevColor[i];
+  //  }
+
+  //  if (aShapeType == 6 || aShapeType == 0) { // if this is an edge or a compound
+  //    if (isConstruction) {
+  //      isCustomized = thePrs->setWidth(SKETCH_LINE_WIDTH_AUXILIARY()) || isCustomized;
+  //      isCustomized = thePrs->setLineStyle(SKETCH_LINE_STYLE_AUXILIARY()) || isCustomized;
+  //    }
+  //    else {
+  //      isCustomized = thePrs->setWidth(SKETCH_LINE_WIDTH()) || isCustomized;
+  //      isCustomized = thePrs->setLineStyle(SKETCH_LINE_STYLE()) || isCustomized;
+  //    }
+  //  }
+  //  else if (aShapeType == 7) { // otherwise this is a vertex
+  //    // The width value do not have effect on the point presentation.
+  //    // It is defined in order to extend selection area of the object.
+  //    thePrs->setWidth(17);
+  //  //  thePrs->setPointMarker(1, 1.); // Set point as a '+' symbol
+  //  }
+  //  if(isCopy() && !isIncludeToResult()) {
+  //    double aWidth = thePrs->width();
+  //    isCustomized = thePrs->setWidth(aWidth / 2.5) || isCustomized;
+  //  }
+
+  //  if (!theResult.get()) {
+  //    double aDeflection = Config_PropManager::real("Visualization", "construction_deflection");
+  //    thePrs->setDeflection(aDeflection);
+  //  }
+  //  return isCustomized;
+  //}
 // LCOV_EXCL_STOP
 
 protected:
index a285ea2431c1e7b8a2364b91047292a88f43e56e..0147ba521d38ed1f2be00ff5aa870a3d85f3f6a3 100644 (file)
@@ -537,6 +537,32 @@ GeomPnt2dPtr flyoutPointCoordinates(const ConstraintPtr& theConstraint)
   return GeomPnt2dPtr(new GeomAPI_Pnt2d(X, Y));
 }
 
+
+void customizeFeaturePrs(const AISObjectPtr& thePrs, bool isAxiliary)
+{
+  std::vector<int> aColor;
+  int aWidth = 1;
+  if (isAxiliary) {
+    thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE_AUXILIARY());
+    aColor = Config_PropManager::color("Visualization", "sketch_auxiliary_color");
+    aWidth = SketchPlugin_SketchEntity::SKETCH_LINE_WIDTH_AUXILIARY();
+  }
+  else {
+    thePrs->setLineStyle(SketchPlugin_SketchEntity::SKETCH_LINE_STYLE());
+    aColor = Config_PropManager::color("Visualization", "sketch_entity_color");
+    aWidth = Config_PropManager::integer("Visualization", "sketch_line_width");
+  }
+  thePrs->setWidth(aWidth);
+  thePrs->setColor(aColor[0], aColor[1], aColor[2]);
+}
+
+void setDimensionColor(const AISObjectPtr& theDimPrs)
+{
+  std::vector<int> aColor = Config_PropManager::color("Visualization", "sketch_dimension_color");
+  if (aColor.size() == 3)
+    theDimPrs->setColor(aColor[0], aColor[1], aColor[2]);
+}
+
 } // namespace SketchPlugin_Tools
 
 
index f29e192dffa83622bd7b849635dd80738fe1c194..a45ecf05a85899eeef033f8964028dabdc8e3e9c 100644 (file)
@@ -26,6 +26,7 @@
 #include <ModelAPI_Attribute.h>
 #include <ModelAPI_AttributeRefAttr.h>
 #include <GeomAPI_Shape.h>
+#include <GeomAPI_AISObject.h>
 #include <GeomDataAPI_Point2D.h>
 #include <GeomAlgoAPI_ShapeTools.h>
 
@@ -135,9 +136,16 @@ void convertRefAttrToPointOrTangentCurve(const AttributeRefAttrPtr&      theRefA
                                          std::shared_ptr<GeomAPI_Shape>& theTangentCurve,
                                          std::shared_ptr<GeomAPI_Pnt2d>& thePassingPoint);
 
-
 /// Calculate global coordinates for flyout point of Length constraint
 GeomPnt2dPtr flyoutPointCoordinates(const std::shared_ptr<SketchPlugin_Constraint>& theConstraint);
+
+/// Sets attributes of feature presentation
+/// \param[in] thePrs a presentation
+/// \param[in] isAxiliary is axiliary flag
+void customizeFeaturePrs(const AISObjectPtr& thePrs, bool isAxiliary);
+
+void setDimensionColor(const AISObjectPtr& theDimPrs);
+
 }; // namespace SketchPlugin_Tools
 
 namespace SketchPlugin_SegmentationTools
diff --git a/src/SketchPlugin/SketchPlugin_msg_fr.ts b/src/SketchPlugin/SketchPlugin_msg_fr.ts
new file mode 100644 (file)
index 0000000..d22b51e
--- /dev/null
@@ -0,0 +1,4716 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Macros</source>
+      <translation>Macros</translation>
+    </message>
+    <message>
+      <source>Sketch</source>
+      <translation>Esquisse</translation>
+    </message>
+    <message>
+      <source>Sketch drawer</source>
+      <translation>Tiroir à esquisse</translation>
+    </message>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Angular copy</source>
+      <translation>Copie angulaire</translation>
+    </message>
+    <message>
+      <source>Arc</source>
+      <translation>Arc</translation>
+    </message>
+    <message>
+      <source>Circle</source>
+      <translation>Cercle</translation>
+    </message>
+    <message>
+      <source>Coincident</source>
+      <translation>Coïncident</translation>
+    </message>
+    <message>
+      <source>Collinear</source>
+      <translation>Colinéaire</translation>
+    </message>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+    <message>
+      <source>Ellipse</source>
+      <translation>Ellipse</translation>
+    </message>
+    <message>
+      <source>Equal</source>
+      <translation>Égal</translation>
+    </message>
+    <message>
+      <source>Fixed</source>
+      <translation>Fixé</translation>
+    </message>
+    <message>
+      <source>Horizontal</source>
+      <translation>Horizontal</translation>
+    </message>
+    <message>
+      <source>Horizontal Distance</source>
+      <translation>Distance horizontale</translation>
+    </message>
+    <message>
+      <source>Length</source>
+      <translation>Longueur</translation>
+    </message>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+    <message>
+      <source>Middle point</source>
+      <translation>Point milieu</translation>
+    </message>
+    <message>
+      <source>Mirror copy</source>
+      <translation>Copie miroir</translation>
+    </message>
+    <message>
+      <source>Parallel</source>
+      <translation>Parallèle</translation>
+    </message>
+    <message>
+      <source>Perpendicular</source>
+      <translation>Perpendiculaire</translation>
+    </message>
+    <message>
+      <source>Projection</source>
+      <translation>Projection</translation>
+    </message>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+    <message>
+      <source>Rectangle</source>
+      <translation>Rectangle</translation>
+    </message>
+    <message>
+      <source>Tangent</source>
+      <translation>Tangente</translation>
+    </message>
+    <message>
+      <source>Trim</source>
+      <translation>Réduire</translation>
+    </message>
+    <message>
+      <source>Vertical</source>
+      <translation>Verticale</translation>
+    </message>
+    <message>
+      <source>Vertical Distance</source>
+      <translation>Distance verticale</translation>
+    </message>
+  </context>
+
+  <!-- Validators -->
+
+  <context>
+    <name>Sketch:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un plan pour l&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:DirX</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un plan pour l&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:External:GeomValidators_Face</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Seule la sélection d&apos;attribut peut être utilisée pour la face d&apos;esquisse, pas %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:External:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a face.</source>
+      <translation>L&apos;esquisse ne peut être créée que sur une face</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:External:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a plane.</source>
+      <translation>L&apos;esquisse ne peut être créée que sur une face plane</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:External:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not a cylinder.</source>
+      <translation>L&apos;esquisse ne peut être créée que sur une face cylindrique</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:External:GeomValidators_Face</name>
+    <message>
+      <source>The shape is not an available face.</source>
+      <translation>L&apos;esquisse ne peut pas être créée sur la face sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un plan pour l&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:Features</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Les objets d&apos;esquisse ne sont pas définis</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMacroCircle:CircleRadius:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>La valeur du rayon est trop petite</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Un point central n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:CircleCenter</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:FirstPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:SecondPoint</name>
+    <message>
+      <source>Attribute "SecondPoint" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:ThirdPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:CircleRadius</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:CircleRadius:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>Le rayon entier n&apos;est pas initialisé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:CircleRadius:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>Le rayon entier doit être défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:center_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point dans la vue</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:passed_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Un point central n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:center_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue</translation>
+    </message>
+    <message>
+      <source>Center point</source>
+      <translation>Point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:first_point</name>
+    <message>
+      <source>First point</source>
+      <translation>Premier point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:passed_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue</translation>
+    </message>
+    <message>
+      <source>Passed point</source>
+      <translation>Point passé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:second_point</name>
+    <message>
+      <source>Second point</source>
+      <translation>Deuxième point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:circle_radius</name>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:passed_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:third_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMacroCircle:third_point</name>
+    <message>
+      <source>Third point</source>
+      <translation>Troisième point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchCircle:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchCircle:circle_center</name>
+    <message>
+      <source>Center</source>
+      <translation>Centre</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchCircle:circle_radius</name>
+    <message>
+      <source>Set radius</source>
+      <translation>Définir le rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchCircle:circle_radius</name>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintHorizontal:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal</name>
+    <message>
+      <source>ModelAPI_StateInvalidArgument</source>
+      <translation>Mauvais objet sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>L&apos;argument de contrainte ne contient pas d&apos;élément avec un type de forme acceptable. Le type devrait être l&apos;un des suivants : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>L&apos;argument de contrainte ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>L&apos;argument de contrainte fait référence à %1 mais doit être %2</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;argument de contrainte de type %1 n&apos;est pas pris en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintPerpendicular:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La première ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>La première ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>La deuxième ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>La deuxième ligne fait référence à un type de forme non acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La deuxième ligne ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>La deuxième ligne fait référence à %1 mais doit être %2</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>La deuxième ligne de type %1 n&apos;est pas prise en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>La deuxième ligne se réfère à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La deuxième ligne se réfère à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Deux lignes externes ne peuvent pas être contraintes comme perpendiculaires</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La première ligne ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme de la première ligne est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Deux lignes externes ne peuvent pas être contraintes comme perpendiculaires</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintRadius:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le cercle n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le cercle n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintFlyoutValuePnt</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>La valeur du rayon n&apos;est pas positive</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>Le rayon est trop petit</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>Le rayon entier doit être défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>Le rayon entier doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>L&apos;argument du cercle ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme d&apos;argument de cercle est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintVertical</name>
+    <message>
+      <source>ModelAPI_StateInvalidArgument</source>
+      <translation>Mauvais objet sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>La première ligne fait référence à un type de forme non acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La première ligne ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>La première ligne fait référence à %1 mais doit être %2</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>La première ligne de type %1 n&apos;est pas prise en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>La première ligne fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La première ligne se réfère à la forme vide</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchLine:GeomValidators_Different</name>
+    <message>
+      <source>Attributes StartPoint and EndPoint are equal.</source>
+      <translation>Le point de départ et le point final sont identiques</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point final n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:EndPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point d&apos;arrivée dans la vue</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:StartPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point de départ dans la vue</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:StartPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point de départ n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:EndPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point final n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point final n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:EndPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point d&apos;arrivée dans la vue</translation>
+    </message>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:StartPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point de départ dans la vue</translation>
+    </message>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:LineLength</name>
+    <message>
+      <source>Length</source>
+      <translation>Longueur</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchPoint:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchPoint:PointCoordinates</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchPoint:PointCoordinates</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchPoint:PointCoordinates</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchRectangle:GeomValidators_Different</name>
+    <message>
+      <source>Attributes RectStartPoint and RectEndPoint are equal.</source>
+      <translation>Le point de départ et le point final doivent être différents</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:RectEndPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point final du rectangle.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:RectStartPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:RectEndPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point final du rectangle.</translation>
+    </message>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:RectStartPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:RectEndPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:RectStartPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchArc:ArcRadius:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>La valeur du rayon n&apos;est pas positive</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcTangentPoint:SketchPlugin_ArcTangentPoint</name>
+    <message>
+      <source>The attribute ArcTangentPoint should be a point</source>
+      <translation>Le point d&apos;arc tangent n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcCenter</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcCenter</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point central n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcEndPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point d&apos;arrivée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcPassedPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point intermédiaire</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcStartPoint</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:GeomValidators_Different</name>
+    <message>
+      <source>Attributes ArcCenter and ArcStartPoint are equal.</source>
+      <translation>Le point central et le point final doivent être différents</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:GeomValidators_Different</name>
+    <message>
+      <source>Attributes ArcStartPoint and ArcEndPoint are equal.</source>
+      <translation>Le point de départ et le point final doivent être différents</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point final n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcRadius:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>Le rayon de l&apos;arc est trop petit</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcRadius:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>Le rayon de l&apos;arc entier doit être défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:ArcRadius:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>Le rayon de l&apos;arc entier doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:Model_FeatureValidator:ArcStartPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point de départ d&apos;arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:angle</name>
+    <message>
+      <source>Set angle</source>
+      <translation>Définir l&apos;angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:center_point</name>
+    <message>
+      <source>Center</source>
+      <translation>Centre</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:end_point</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:radius</name>
+    <message>
+      <source>Set radius</source>
+      <translation>Définir le rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:start_point</name>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchArc:radius</name>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintMirror:ConstraintMirrorList</name>
+    <message>
+      <source>Segments</source>
+      <translation>Segments</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne miroir n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne miroir n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>La ligne miroir renvoie à un type de forme non acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La ligne de miroir ne renvoie à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>La ligne miroir renvoie à %1 mais doit être %2</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>La ligne miroir de type %1 n&apos;est pas prise en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>La ligne miroir renvoie à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La ligne en miroir fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintMirrorList</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionner des objets</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMultiRotation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le type d&apos;angle n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le centre de rotation n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Le nombre total d&apos;objets pivotés n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>Le nombre total d&apos;objets en rotation doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>Le nombre total d&apos;objets pivotés n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>Le nombre total d&apos;objets en rotation doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationList:SketchPlugin_CopyValidator</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationList:SketchPlugin_CopyValidator</name>
+    <message>
+      <source>The object %1 is a result of copy</source>
+      <translation>L&apos;objet %1 est le résultat d&apos;une copie et ne peut pas être pivoté</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le centre de rotation ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme du centre de rotation est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le centre de rotation fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Le centre de rotation se réfère à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationList</name>
+    <message>
+      <source>Segments</source>
+      <translation>Segments</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMultiTranslation:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point final du vecteur de translation n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le point final du vecteur de translation n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le point final du vecteur de translation n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le point de départ du vecteur de translation n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Le nombre total d&apos;objets traduits n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>Le nombre total d&apos;objets traduits doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>Le nombre total d&apos;objets traduits n&apos;est pas défini</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationObjects:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>Le nombre total d&apos;objets traduits doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationList:SketchPlugin_CopyValidator</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationList:SketchPlugin_CopyValidator</name>
+    <message>
+      <source>The object %1 is a result of copy</source>
+      <translation>L&apos;objet %1 est le résultat d&apos;une copie et ne peut pas être traduit</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le point de départ de la translation ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme du point de départ de la translation est &quot;%1&quot;, il doit correspondre à &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le point de départ du vecteur de translation n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le point de départ se réfère à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Le point de départ se réfère à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le point final de la translation ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme du point final de la translation est &quot;%1&quot;, il doit correspondre à &quot;%2&quot;.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Sélectionnez un point d&apos;arrivée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>Le point final fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>Le point final fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationList</name>
+    <message>
+      <source>Segments</source>
+      <translation>Segments</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintAngle:ConstraintFlyoutValuePnt</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Il n’est pas possible de créer un angle entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:AngleReversedLine1</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le premier objet ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le premier type de forme d&apos;objet est &quot;%1&quot;, il devrait correspondre à &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Il n’est pas possible de créer un angle entre deux entités externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le deuxième objet ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le deuxième type de forme d&apos;objet est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityA:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityA and ConstraintEntityB attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityB:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityB and ConstraintEntityA attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityB:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Une coïncidence ne peut pas être créée entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityA:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Une coïncidence ne peut pas être créée entre deux objets externes</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintDistance:ConstraintFlyoutValuePnt</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>La distance doit être définie</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>La distance est trop petite</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>La valeur de distance entière doit être définie</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>La valeur de distance entière doit être positive</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>La distance ne peut pas être définie entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le premier objet ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le premier type de forme d&apos;objet est &quot;%1&quot;, il devrait correspondre à &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>La distance ne peut pas être définie entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>Le deuxième objet ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le deuxième type de forme d&apos;objet est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityA:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityA and ConstraintEntityB attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityB:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityB and ConstraintEntityA attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityB:SketchPlugin_EqualAttr</name>
+    <message>
+      <source>An empty object is used.</source>
+      <translation>Un objet vide est utilisé</translation>
+    </message>
+    <message>
+      <source>The %1 feature is not supported by the Equal constraint.</source>
+      <translation>La fonctionnalité %1 n&apos;est pas prise en charge par la contrainte Equal.</translation>
+    </message>
+    <message>
+      <source>Features with kinds %1 and %2 can not be equal.</source>
+      <translation>Les caractéristiques avec les types %1 et %2 ne peuvent pas être égales.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityB:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Une égalité ne peut pas être définie entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityA:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Une égalité ne peut pas être définie entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityA</name>
+    <message>
+      <source>Select edge</source>
+      <translation>Sélectionnez une arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityB</name>
+    <message>
+      <source>Select edge</source>
+      <translation>Sélectionnez une arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le premier arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le deuxième arête</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintLength:ConstraintFlyoutValuePnt</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Définir la valeur de la longueur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>La longueur est trop petite</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>Définir la valeur de la longueur entière</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>La valeur de la longueur entière n&apos;est pas positive</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La ligne ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme de ligne est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityA:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityA and ConstraintEntityB attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityB:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityB and ConstraintEntityA attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityB:SketchPlugin_MiddlePointAttr</name>
+    <message>
+      <source>Middle point constraint allows points and lines only</source>
+      <translation>Pas de point ou de ligne sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityB:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Un milieu ne peut pas être défini pour deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityA:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Un milieu ne peut pas être défini pour deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>La première ligne n&apos;est pas sélectionnée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Une parallèle ne peut pas être définie entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La première ligne ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme de la première ligne est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA:SketchPlugin_ExternalValidator</name>
+    <message>
+      <source>Both features, attribute and attribute in parameter, are external.</source>
+      <translation>Une parallèle ne peut pas être définie entre deux objets externes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>Le type de forme doit être %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La deuxième ligne ne fait référence à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>Le type de forme de la deuxième ligne est &quot;%1&quot;, il devrait être &quot;%2&quot;</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>L&apos;attribut avec le type %1 n&apos;est pas traité</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>L&apos;argument de contrainte fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It does not contain element with acceptable shape type. The type should be one of the next: %1</source>
+      <translation>La contrainte fixe fait référence à un type de forme non acceptable. Le type doit être : %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>It has reference to an empty attribute</source>
+      <translation>La contrainte fixe ne renvoie à rien</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>Shape type is "%1", it should be "%2"</source>
+      <translation>La contrainte fixe fait référence à %1 mais doit être %2</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>La contrainte fixe de type %1 n&apos;est pas prise en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The result is empty</source>
+      <translation>La contrainte fixe fait référence à un élément non existant</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The shape is empty</source>
+      <translation>La contrainte fixe fait référence à la forme vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA</name>
+    <message>
+      <source>Select point, curve or its boundary point.</source>
+      <translation>Sélectionnez un point, une courbe ou son point limite.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityA:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityA and ConstraintEntityB attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityB:PartSet_DifferentObjects</name>
+    <message>
+      <source>The feature uses one  object in ConstraintEntityB and ConstraintEntityA attributes.</source>
+      <translation>Différents objets doivent être sélectionnés</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityA:SketchPlugin_TangentAttr</name>
+    <message>
+      <source>Two segments cannot be tangent</source>
+      <translation>Deux segments ne peuvent pas être tangents</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityB:SketchPlugin_TangentAttr</name>
+    <message>
+      <source>It uses an empty object</source>
+      <translation>La sélection n&apos;est pas valide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le deuxième objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintSplit:ConstraintEntityA:SketchPlugin_SplitValidator</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Seule la sélection d&apos;attribut peut être utilisée pour la face d&apos;esquisse, pas %1</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchFillet:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Définir le rayon du congé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>Le rayon du congé doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not initialized.</source>
+      <translation>Définir le rayon du congé entier</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintValue:GeomValidators_Positive</name>
+    <message>
+      <source>Integer is not positive.</source>
+      <translation>Le rayon du congé entier doit être positif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un ou plusieurs points pour le congé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:fillet_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un ou plusieurs points pour le congé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintEntityA:SketchPlugin_FilletVertexValidator</name>
+    <message>
+      <source>Error: List of points is empty.</source>
+      <translation>La liste des points est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintEntityA:SketchPlugin_FilletVertexValidator</name>
+    <message>
+      <source>Error: one of the selected point does not have coincidence.</source>
+      <translation>Un des points sélectionné n&apos;a pas de coïncidence</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintEntityA:SketchPlugin_FilletVertexValidator</name>
+    <message>
+      <source>Error: One of the selected points does not have two suitable edges for fillet.</source>
+      <translation>Un des points sélectionnés ne possède pas deux arêtes appropriées pour le congé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintEntityA:SketchPlugin_FilletVertexValidator</name>
+    <message>
+      <source>Error: Edges in selected point has tangent constraint.</source>
+      <translation>Les arêtes du point sélectionné ont une contrainte de tangence</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:ConstraintEntityA:SketchPlugin_FilletVertexValidator</name>
+    <message>
+      <source>Error: Edges in selected point has tangent constraint.</source>
+      <translation>Les arêtes du point sélectionné ont une contrainte de tangence</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchProjection:ExternalFeature:SketchPlugin_ProjectionValidator</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Un argument de type %1 de la fonctionnalité de projection n&apos;est pas pris en charge</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchProjection:ExternalFeature:SketchPlugin_ProjectionValidator</name>
+    <message>
+      <source>The attribute %1 should be an edge</source>
+      <translation>L&apos;attribut %1 doit être une arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchProjection:ExternalFeature:SketchPlugin_ProjectionValidator</name>
+    <message>
+      <source>There is no sketch referring to the current feature</source>
+      <translation>La fonction de projection n&apos;a pas d&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchProjection:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchProjection:ExternalFeature</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>Sketch</name>
+    <message>
+      <source>Create sketch</source>
+      <translation>Créer une esquisse</translation>
+    </message>
+    <message>
+      <source>Sketch</source>
+      <translation>Esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:External</name>
+    <message>
+      <source>Select a plane on which to create a sketch</source>
+      <translation>Sélectionnez un plan sur lequel créer une esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:SketchPlugin_SolverErrorValidator</name>
+    <message>
+      <source>The constraint is conflicting with others. To fix this, you can either undo your operation or remove a conflicting constraint.</source>
+      <translation>La contrainte est en conflit avec les autres. Pour résoudre ce problème, vous pouvez annuler votre opération ou supprimer une contrainte en conflit.</translation>
+    </message>
+  </context>
+  <context>
+    <name>Sketch:SketchPlugin_SolverErrorValidator</name>
+    <message>
+      <source>The set of constraints lead to degenerated geometry. To fix this, you can either undo your operation or remove a constraint or the degenerated geometry.</source>
+      <translation>L&apos;ensemble des contraintes conduit à une géométrie dégénérée. Pour résoudre ce problème, vous pouvez annuler votre opération ou supprimer une contrainte ou la géométrie dégénérée..</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintAngle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Set fixed angle between two line segments</source>
+      <translation>Définir un angle fixe entre deux segments</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:AngleType</name>
+    <message>
+      <source>Additional</source>
+      <translation>Additionnel</translation>
+    </message>
+    <message>
+      <source>Angle type</source>
+      <translation>Type d&apos;angle</translation>
+    </message>
+    <message>
+      <source>Complementary</source>
+      <translation>Complémentaire</translation>
+    </message>
+    <message>
+      <source>Direct</source>
+      <translation>Direct</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:AngleValue</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Value</source>
+      <translation>Valeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityA</name>
+    <message>
+      <source>Line 1</source>
+      <translation>Ligne 1</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:ConstraintEntityB</name>
+    <message>
+      <source>Line 2</source>
+      <translation>Ligne 2</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:LocationType</name>
+    <message>
+      <source>Automatic</source>
+      <translation>Automatique</translation>
+    </message>
+    <message>
+      <source>Left</source>
+      <translation>Gauche</translation>
+    </message>
+    <message>
+      <source>Right</source>
+      <translation>Droite</translation>
+    </message>
+    <message>
+      <source>Text location</source>
+      <translation>Localisation du texte</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintAngle:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Le premier objet n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintCoincidence</name>
+    <message>
+      <source>Coincident</source>
+      <translation>Coïncident</translation>
+    </message>
+    <message>
+      <source>Create constraint for the coincidence of two points or point on line or circle</source>
+      <translation>Créer une contrainte pour la coïncidence de deux points ou d&apos;un point sur une ligne ou un cercle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityA</name>
+    <message>
+      <source>First object</source>
+      <translation>Premier objet</translation>
+    </message>
+    <message>
+      <source>Select a first object</source>
+      <translation>Sélectionnez un premier objet</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCoincidence:ConstraintEntityB</name>
+    <message>
+      <source>Second object</source>
+      <translation>Deuxième objet</translation>
+    </message>
+    <message>
+      <source>Select a second object</source>
+      <translation>Sélectionnez un deuxième objet</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintCollinear</name>
+    <message>
+      <source>Collinear</source>
+      <translation>Colinéaire</translation>
+    </message>
+    <message>
+      <source>Create constraint defining collinearity of two lines</source>
+      <translation>Créer une contrainte définissant la colinéarité de deux lignes</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCollinear:ConstraintEntityA</name>
+    <message>
+      <source>First line</source>
+      <translation>Première ligne</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCollinear:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCollinear:ConstraintEntityB</name>
+    <message>
+      <source>Second line</source>
+      <translation>Deuxième ligne</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCollinear:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCollinear:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCollinear:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le premier ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintCollinear:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le deuxième ligne</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintDistance</name>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+    <message>
+      <source>Set fixed distance from a point to an object</source>
+      <translation>Définir une distance fixe entre un point et un objet</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance</name>
+    <message>
+      <source>Select objects for distance definition. Following objects can be accepted: point, line or arc end point, center of circle or arc.</source>
+      <translation>Sélectionnez des objets pour la définition de la distance. Les objets suivants peuvent être acceptés : point, ligne ou arc point final, centre du cercle ou arc.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityA</name>
+    <message>
+      <source>First object</source>
+      <translation>Premier objet</translation>
+    </message>
+    <message>
+      <source>Select point, line end point, line, center of circle or arc.</source>
+      <translation>Sélectionner un point, une fin de ligne, une ligne, le centre du cercle ou un arc.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintEntityB</name>
+    <message>
+      <source>Second object</source>
+      <translation>Deuxième objet</translation>
+    </message>
+    <message>
+      <source>Select point, line end point, line, center of circle or arc.</source>
+      <translation>Sélectionner un point, une fin de ligne, une ligne, le centre du cercle ou un arc.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:ConstraintValue</name>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+    <message>
+      <source>Value</source>
+      <translation>Valeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:LocationType</name>
+    <message>
+      <source>Automatic</source>
+      <translation>Automatique</translation>
+    </message>
+    <message>
+      <source>Left</source>
+      <translation>Gauche</translation>
+    </message>
+    <message>
+      <source>Right</source>
+      <translation>Droite</translation>
+    </message>
+    <message>
+      <source>Text location</source>
+      <translation>Localisation du texte</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistance:SignedDistance</name>
+    <message>
+      <source>Keep distance orientation</source>
+      <translation>Garder l&apos;orientation de la distance</translation>
+    </message>
+    <message>
+      <source>Keep orientation</source>
+      <translation>Gardez l&apos;orientation</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintDistanceHorizontal</name>
+    <message>
+      <source>Horizontal Distance</source>
+      <translation>Distance horizontale</translation>
+    </message>
+    <message>
+      <source>Set horizontal distance between two points</source>
+      <translation>Définir la distance horizontale entre deux points</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:ConstraintEntityA</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal</name>
+    <message>
+      <source>Select points for distance definition.</source>
+      <translation>Sélectionner des points pour la définition de la distance.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:ConstraintEntityA</name>
+    <message>
+      <source>First point</source>
+      <translation>Premier point</translation>
+    </message>
+    <message>
+      <source>Select point.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:ConstraintEntityB</name>
+    <message>
+      <source>Second point</source>
+      <translation>Deuxième point</translation>
+    </message>
+    <message>
+      <source>Select point.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:ConstraintEntityB</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:DistanceValue</name>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+    <message>
+      <source>Value</source>
+      <translation>Valeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:DistanceValue:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Double n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:DistanceValue:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>La valeur est trop petite</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:LocationType</name>
+    <message>
+      <source>Automatic</source>
+      <translation>Automatique</translation>
+    </message>
+    <message>
+      <source>Left</source>
+      <translation>Gauche</translation>
+    </message>
+    <message>
+      <source>Right</source>
+      <translation>Droite</translation>
+    </message>
+    <message>
+      <source>Text location</source>
+      <translation>Localisation du texte</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceHorizontal:ConstraintFlyoutValuePnt</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintDistanceVertical</name>
+    <message>
+      <source>Set vertical distance between two points</source>
+      <translation>Définir la distance verticale entre deux points</translation>
+    </message>
+    <message>
+      <source>Vertical Distance</source>
+      <translation>Distance verticale</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical</name>
+    <message>
+      <source>Select points for distance definition.</source>
+      <translation>Sélectionner des points pour la définition de la distance.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:ConstraintEntityA</name>
+    <message>
+      <source>First point</source>
+      <translation>Premier point</translation>
+    </message>
+    <message>
+      <source>Select point.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:ConstraintEntityA:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:ConstraintEntityB</name>
+    <message>
+      <source>Second point</source>
+      <translation>Deuxième point</translation>
+    </message>
+    <message>
+      <source>Select point.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:ConstraintEntityB:GeomValidators_ShapeType</name>
+    <message>
+      <source>The object is empty</source>
+      <translation>L&apos;objet est vide</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:DistanceValue</name>
+    <message>
+      <source>Distance</source>
+      <translation>Distance</translation>
+    </message>
+    <message>
+      <source>Value</source>
+      <translation>Valeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:DistanceValue:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Double n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:LocationType</name>
+    <message>
+      <source>Automatic</source>
+      <translation>Automatique</translation>
+    </message>
+    <message>
+      <source>Left</source>
+      <translation>Gauche</translation>
+    </message>
+    <message>
+      <source>Right</source>
+      <translation>Droite</translation>
+    </message>
+    <message>
+      <source>Text location</source>
+      <translation>Localisation du texte</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:ConstraintFlyoutValuePnt</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintDistanceVertical:DistanceValue:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>La valeur est trop petite.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintEqual</name>
+    <message>
+      <source>Create constraint defining equal lengths of two lines or line and arc or equal radiuses of two arcs or two circles or arc and circle</source>
+      <translation>Créer une contrainte définissant des longueurs égales de deux lignes, ou une ligne et un arc, ou des rayons égaux de deux arcs ou de deux cercles ou d&apos;un arc et d&apos;un cercle</translation>
+    </message>
+    <message>
+      <source>Equal</source>
+      <translation>Égal</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityA</name>
+    <message>
+      <source>First object</source>
+      <translation>Premier objet</translation>
+    </message>
+    <message>
+      <source>Select line, circle or arc</source>
+      <translation>Sélectionnez une ligne, un cercle ou un arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintEqual:ConstraintEntityB</name>
+    <message>
+      <source>Second object</source>
+      <translation>Deuxième objet</translation>
+    </message>
+    <message>
+      <source>Select line, circle or arc</source>
+      <translation>Sélectionnez une ligne, un cercle ou un arc</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintHorizontal</name>
+    <message>
+      <source>Create constraint defining horizontal line</source>
+      <translation>Créer une contrainte définissant une ligne horizontale</translation>
+    </message>
+    <message>
+      <source>Horizontal</source>
+      <translation>Horizontal</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintHorizontal:ConstraintEntityA</name>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintLength</name>
+    <message>
+      <source>Length</source>
+      <translation>Longueur</translation>
+    </message>
+    <message>
+      <source>Set fixed length of a line segment</source>
+      <translation>Définir la longueur fixe d&apos;un segment</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength</name>
+    <message>
+      <source>Select a line on which to calculate length</source>
+      <translation>Sélectionnez une ligne sur laquelle calculer la longueur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintEntityA</name>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:ConstraintValue</name>
+    <message>
+      <source>Length</source>
+      <translation>Longueur</translation>
+    </message>
+    <message>
+      <source>Value</source>
+      <translation>Valeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintLength:LocationType</name>
+    <message>
+      <source>Automatic</source>
+      <translation>Automatique</translation>
+    </message>
+    <message>
+      <source>Left</source>
+      <translation>Gauche</translation>
+    </message>
+    <message>
+      <source>Right</source>
+      <translation>Droite</translation>
+    </message>
+    <message>
+      <source>Text location</source>
+      <translation>Localisation du texte</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintMiddle</name>
+    <message>
+      <source>Create constraint for setting middle point on a line</source>
+      <translation>Créer une contrainte pour définir le milieu de la ligne</translation>
+    </message>
+    <message>
+      <source>Middle point</source>
+      <translation>Point milieu</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityA</name>
+    <message>
+      <source>First object</source>
+      <translation>Premier objet</translation>
+    </message>
+    <message>
+      <source>Select a first object</source>
+      <translation>Sélectionnez un premier objet</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMiddle:ConstraintEntityB</name>
+    <message>
+      <source>Second object</source>
+      <translation>Deuxième objet</translation>
+    </message>
+    <message>
+      <source>Select a second object</source>
+      <translation>Sélectionnez un deuxième objet</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintMirror</name>
+    <message>
+      <source>Create constraint, mirroring group of objects</source>
+      <translation>Créer une contrainte, mettre en miroir un groupe d&apos;objets</translation>
+    </message>
+    <message>
+      <source>Mirror copy</source>
+      <translation>Copie miroir</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintEntityA</name>
+    <message>
+      <source>Mirror line</source>
+      <translation>Ligne miroir</translation>
+    </message>
+    <message>
+      <source>Select mirror line</source>
+      <translation>Sélectionnez la ligne miroir</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintMirror:ConstraintMirrorList</name>
+    <message>
+      <source>Select list of objects to be mirrored</source>
+      <translation>Sélectionner la liste des objets à mettre en miroir</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintParallel</name>
+    <message>
+      <source>Create constraint defining two parallel lines</source>
+      <translation>Créer une contrainte définissant deux lignes parallèles</translation>
+    </message>
+    <message>
+      <source>Parallel</source>
+      <translation>Parallèle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityA</name>
+    <message>
+      <source>First line</source>
+      <translation>Première ligne</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintParallel:ConstraintEntityB</name>
+    <message>
+      <source>Second line</source>
+      <translation>Deuxième ligne</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintPerpendicular</name>
+    <message>
+      <source>Create constraint defining two orthogonal objects</source>
+      <translation>Créer une contrainte définissant deux objets orthogonaux</translation>
+    </message>
+    <message>
+      <source>Perpendicular</source>
+      <translation>Perpendiculaire</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityA</name>
+    <message>
+      <source>First object</source>
+      <translation>Premier objet</translation>
+    </message>
+    <message>
+      <source>Select line or arc</source>
+      <translation>Sélectionnez une ligne ou un arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintPerpendicular:ConstraintEntityB</name>
+    <message>
+      <source>Second object</source>
+      <translation>Deuxième objet</translation>
+    </message>
+    <message>
+      <source>Select line or arc</source>
+      <translation>Sélectionnez une ligne ou un arc</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintRadius</name>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+    <message>
+      <source>Set fixed radius of a circle or an arc</source>
+      <translation>Définir le rayon fixe d&apos;un cercle ou d&apos;un arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius</name>
+    <message>
+      <source>Select a circle or an arc on which to calculate radius</source>
+      <translation>Sélectionnez un cercle ou un arc sur lequel calculer le rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintEntityA</name>
+    <message>
+      <source>Circle or Arc</source>
+      <translation>Cercle ou arc</translation>
+    </message>
+    <message>
+      <source>Select a circle or an arc</source>
+      <translation>Sélectionnez un cercle ou un arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:ConstraintValue</name>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+    <message>
+      <source>Value</source>
+      <translation>Valeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRadius:LocationType</name>
+    <message>
+      <source>Automatic</source>
+      <translation>Automatique</translation>
+    </message>
+    <message>
+      <source>Left</source>
+      <translation>Gauche</translation>
+    </message>
+    <message>
+      <source>Right</source>
+      <translation>Droite</translation>
+    </message>
+    <message>
+      <source>Text location</source>
+      <translation>Localisation du texte</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintRigid</name>
+    <message>
+      <source>Fix an object</source>
+      <translation>Maintenir un objet</translation>
+    </message>
+    <message>
+      <source>Fixed</source>
+      <translation>Fixé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintRigid:ConstraintEntityA</name>
+    <message>
+      <source>Object</source>
+      <translation>Objet</translation>
+    </message>
+    <message>
+      <source>Select point, line end point, line, center of circle or arc.</source>
+      <translation>Sélectionner un point, une fin de ligne, une ligne, le centre du cercle ou un arc.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintTangent</name>
+    <message>
+      <source>Create constraint defining tangency of two segments with common coincident point</source>
+      <translation>Créer une contrainte définissant la tangence de deux segments avec un point de coïncidence commun</translation>
+    </message>
+    <message>
+      <source>Tangent</source>
+      <translation>Tangente</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityA</name>
+    <message>
+      <source>First object</source>
+      <translation>Premier objet</translation>
+    </message>
+    <message>
+      <source>Select line or arc</source>
+      <translation>Sélectionnez une ligne ou un arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintTangent:ConstraintEntityB</name>
+    <message>
+      <source>Second object</source>
+      <translation>Deuxième objet</translation>
+    </message>
+    <message>
+      <source>Select line or arc</source>
+      <translation>Sélectionnez une ligne ou un arc</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchConstraintVertical</name>
+    <message>
+      <source>Create constraint defining vertical line</source>
+      <translation>Créer une contrainte définissant une ligne verticale</translation>
+    </message>
+    <message>
+      <source>Vertical</source>
+      <translation>Verticale</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchConstraintVertical:ConstraintEntityA</name>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+    <message>
+      <source>Select a line</source>
+      <translation>Sélectionnez une ligne</translation>
+    </message>
+  </context>
+
+  <!-- SketchDrawer -->
+  <context>
+    <name>SketchDrawer</name>
+    <message>
+      <source>Creates sketch using elements of selected shape belonging to selected plane</source>
+      <translation>Crée une esquisse en utilisant des éléments de la forme sélectionnée appartenant au plan sélectionné</translation>
+    </message>
+    <message>
+      <source>Sketch drawer</source>
+      <translation>Tiroir à esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchDrawer:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchDrawer:add_dimensions</name>
+    <message>
+      <source>Create dimensions</source>
+      <translation>Créer des dimensions</translation>
+    </message>
+    <message>
+      <source>To add dimensions into created sketch</source>
+      <translation>Pour ajouter des cotes à l&apos;esquisse créée</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchDrawer:base_shape</name>
+    <message>
+      <source>Select a shape for extraction to sketch.</source>
+      <translation>Sélectionnez une forme à extraire pour l&apos;esquisse.</translation>
+    </message>
+    <message>
+      <source>Shape:</source>
+      <translation>Forme:</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchDrawer:plane</name>
+    <message>
+      <source>Plane:</source>
+      <translation>Plan:</translation>
+    </message>
+    <message>
+      <source>Select plane for sketch</source>
+      <translation>Sélectionner un plan pour l&apos;esquisse</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchFillet</name>
+    <message>
+      <source>Create constraint defining fillet between two connected segments</source>
+      <translation>Créer une contrainte définissant un congé entre deux segments connectés</translation>
+    </message>
+    <message>
+      <source>Fillet</source>
+      <translation>Congé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un ou plusieurs points pour le congé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:fillet_point</name>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+    <message>
+      <source>Select point for fillet (should be shared by two entities only)</source>
+      <translation>Sélectionnez un point pour le congé (doit être partagé par deux entités uniquement)</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchFillet:fillet_point:SketchPlugin_FilletVertexValidator</name>
+    <message>
+      <source>Error: Bad point selected.</source>
+      <translation>Erreur : mauvais point sélectionné.</translation>
+    </message>
+    <message>
+      <source>Error: Edges in selected point has tangent constraint.</source>
+      <translation>Erreur : les arêtes du point sélectionné ont une contrainte de tangence.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchIntersectionPoint</name>
+    <message>
+      <source>Intersect edge with sketch plane</source>
+      <translation>Intersecter un bord avec un plan d&apos;esquisse</translation>
+    </message>
+    <message>
+      <source>Intersection</source>
+      <translation>Section</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchIntersectionPoint:ExternalFeature</name>
+    <message>
+      <source>Object</source>
+      <translation>Objet</translation>
+    </message>
+    <message>
+      <source>Select external edge.</source>
+      <translation>Sélectionnez le bord externe.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchIntersectionPoint:ExternalFeature:SketchPlugin_IntersectionValidator</name>
+    <message>
+      <source>The attribute %1 should be an edge</source>
+      <translation>L&apos;attribut %1 doit être une arête</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchIntersectionPoint:IncludeToResult</name>
+    <message>
+      <source>Include into the sketch result</source>
+      <translation>Inclure dans le résultat de l&apos;esquisse</translation>
+    </message>
+    <message>
+      <source>Include projected feature into the sketch result</source>
+      <translation>Inclure la fonctionnalité projetée dans le résultat de l&apos;esquisse</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchIntersectionPoint:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchIntersectionPoint:ExternalFeature</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le bord externe.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchLine</name>
+    <message>
+      <source>Create line</source>
+      <translation>Créer une ligne</translation>
+    </message>
+    <message>
+      <source>Line</source>
+      <translation>Ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchLine:LineLength</name>
+    <message>
+      <source>Length:</source>
+      <translation>Longueur:</translation>
+    </message>
+    <message>
+      <source>Line length</source>
+      <translation>Longueur de la ligne</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMacroArc</name>
+    <message>
+      <source>Arc</source>
+      <translation>Arc</translation>
+    </message>
+    <message>
+      <source>Create arc</source>
+      <translation>Créer un arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:center_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:arc_type</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:angle</name>
+    <message>
+      <source>Set angle</source>
+      <translation>Définir l&apos;angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:arc_type</name>
+    <message>
+      <source>Center and two points</source>
+      <translation>Centre et deux points</translation>
+    </message>
+    <message>
+      <source>Perpendicular to line</source>
+      <translation>Perpendiculaire à la ligne</translation>
+    </message>
+    <message>
+      <source>Tangent with edge</source>
+      <translation>Tangente avec bord</translation>
+    </message>
+    <message>
+      <source>Three points on arc</source>
+      <translation>Trois points sur l&apos;arc</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:passed_point:SketchPlugin_ThirdPointValidator</name>
+    <message>
+      <source>Selected points are on the same line</source>
+      <translation>Les points sélectionnés sont sur la même ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:radius</name>
+    <message>
+      <source>Set radius</source>
+      <translation>Définir le rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:tangent_point</name>
+    <message>
+      <source>Select point on line</source>
+      <translation>Sélectionnez un point sur la ligne</translation>
+    </message>
+    <message>
+      <source>Tangent point</source>
+      <translation>Point tangent</translation>
+    </message>
+    <message>
+      <source>Point on the perpendicular line</source>
+      <translation>Point sur la perpendiculaire</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:tangent_point:SketchPlugin_ArcTangentPoint</name>
+    <message>
+      <source>The attribute %1 should be a point</source>
+      <translation>L&apos;attribut %1 doit être un point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:tangent_point:SketchPlugin_ArcTransversalPoint</name>
+    <message>
+      <source>The attribute %1 should be a point</source>
+      <translation>L&apos;attribut %1 doit être un point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:tangent_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:center_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point central.</translation>
+    </message>
+    <message>
+      <source>Center point</source>
+      <translation>Point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:end_point_1</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point d&apos;arrivée dans la vue.</translation>
+    </message>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:end_point_1</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point d&apos;arrivée dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:end_point_2</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:end_point_3</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:passed_point</name>
+    <message>
+      <source>Passed point</source>
+      <translation>Point passé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:passed_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:start_point_1</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point de départ.</translation>
+    </message>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:start_point_2</name>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:angle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:end_point_2</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:radius</name>
+    <message>
+      <source>Radius</source>
+      <translation>Rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:start_point_1</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:start_point_2</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:tangent_point:SketchPlugin_ArcTransversalPoint</name>
+    <message>
+      <source>Unable to build perpendicular arc on %1</source>
+      <translation>Impossible de créer un arc perpendiculaire sur %1</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:end_point_2</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:end_point_3</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:passed_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroArc:start_point_2</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point dans la vue.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMacroCircle</name>
+    <message>
+      <source>Circle</source>
+      <translation>Cercle</translation>
+    </message>
+    <message>
+      <source>Create circle</source>
+      <translation>Créer un cercle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Un point central n&apos;est pas sélectionné</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:circle_radius</name>
+    <message>
+      <source>Set radius</source>
+      <translation>Définir le rayon</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:circle_radius:GeomValidators_Positive</name>
+    <message>
+      <source>Value is too small.</source>
+      <translation>La valeur est trop petite.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:circle_type</name>
+    <message>
+      <source>Center and passed points</source>
+      <translation>Points centrés et passés</translation>
+    </message>
+    <message>
+      <source>Three points</source>
+      <translation>Trois points</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:third_point:SketchPlugin_ThirdPointValidator</name>
+    <message>
+      <source>Selected points are on the same line</source>
+      <translation>Les points sélectionnés sont sur la même ligne</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:first_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:second_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:third_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:circle_type</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroCircle:second_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le deuxième point.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMacroEllipse</name>
+    <message>
+      <source>Create ellipse</source>
+      <translation>Créer une ellipse</translation>
+    </message>
+    <message>
+      <source>Ellipse</source>
+      <translation>Ellipse</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:ellipse_type</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:passed_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:ellipse_type</name>
+    <message>
+      <source>Center, major semi-axis and passing point</source>
+      <translation>Centre, grand demi-axe et point de passage</translation>
+    </message>
+    <message>
+      <source>Major axis and passing point</source>
+      <translation>Grand axe et point de passage</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:first_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un premier point dans la vue.</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:major_radius</name>
+    <message>
+      <source>Set major radius</source>
+      <translation>Définir le rayon majeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:major_radius:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Double n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:minor_radius</name>
+    <message>
+      <source>Set minor radius</source>
+      <translation>Définir le rayon mineur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:minor_radius:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Double n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:first_point</name>
+    <message>
+      <source>Center point</source>
+      <translation>Point central</translation>
+    </message>
+    <message>
+      <source>Major axis start point</source>
+      <translation>Point de départ du grand axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:passed_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point passé.</translation>
+    </message>
+    <message>
+      <source>Passed point</source>
+      <translation>Point passé</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:second_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un deuxième point.</translation>
+    </message>
+    <message>
+      <source>Major axis end point</source>
+      <translation>Point final du grand axe</translation>
+    </message>
+    <message>
+      <source>Major axis point</source>
+      <translation>Point du grand axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:second_point</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchEllipse:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_center</name>
+    <message>
+      <source>Center</source>
+      <translation>Centre</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_first_focus</name>
+    <message>
+      <source>First focus</source>
+      <translation>Premier foyer</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_major_axis_end_point</name>
+    <message>
+      <source>Major axis end</source>
+      <translation>Fin du grand axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_major_axis_start_point</name>
+    <message>
+      <source>Major axis start</source>
+      <translation>Début du grand axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_major_radius</name>
+    <message>
+      <source>Set major radius</source>
+      <translation>Définir le rayon majeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_minor_axis_end_point</name>
+    <message>
+      <source>Minor axis end</source>
+      <translation>Fin du petit axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_minor_axis_start_point</name>
+    <message>
+      <source>Minor axis start</source>
+      <translation>Début du petit axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_minor_radius</name>
+    <message>
+      <source>Set minor radius</source>
+      <translation>Définir le rayon mineur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_second_focus</name>
+    <message>
+      <source>Second focus</source>
+      <translation>Deuxième objectif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_major_radius</name>
+    <message>
+      <source>Major radius</source>
+      <translation>Rayon majeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipse:ellipse_minor_radius</name>
+    <message>
+      <source>Minor radius</source>
+      <translation>Rayon mineur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:major_radius</name>
+    <message>
+      <source>Major radius</source>
+      <translation>Rayon majeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipse:minor_radius</name>
+    <message>
+      <source>Minor radius</source>
+      <translation>Rayon mineur</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchEllipticArc:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_center</name>
+    <message>
+      <source>Center</source>
+      <translation>Centre</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_first_focus</name>
+    <message>
+      <source>First focus</source>
+      <translation>Premier foyer</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_major_axis_end_point</name>
+    <message>
+      <source>Major axis end</source>
+      <translation>Fin du grand axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_major_axis_start_point</name>
+    <message>
+      <source>Major axis start</source>
+      <translation>Début du grand axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_major_radius</name>
+    <message>
+      <source>Major radius</source>
+      <translation>Rayon majeur</translation>
+    </message>
+    <message>
+      <source>Set major radius</source>
+      <translation>Définir le rayon majeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_minor_axis_end_point</name>
+    <message>
+      <source>Minor axis end</source>
+      <translation>Fin du petit axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_minor_axis_start_point</name>
+    <message>
+      <source>Minor axis start</source>
+      <translation>Début du petit axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_minor_radius</name>
+    <message>
+      <source>Minor radius</source>
+      <translation>Rayon mineur</translation>
+    </message>
+    <message>
+      <source>Set minor radius</source>
+      <translation>Définir le rayon mineur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:ellipse_second_focus</name>
+    <message>
+      <source>Second focus</source>
+      <translation>Deuxième objectif</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:end_point</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchEllipticArc:start_point</name>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc</name>
+    <message>
+      <source>Create elliptic arc</source>
+      <translation>Créer un arc elliptique</translation>
+    </message>
+    <message>
+      <source>Elliptic arc</source>
+      <translation>Arc elliptique</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:center</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point.</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point central.</translation>
+    </message>
+    <message>
+      <source>Center point</source>
+      <translation>Point central</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:end_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point d&apos;arrivée.</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point d&apos;arrivée.</translation>
+    </message>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:major_axis_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>Sélectionnez un point d&apos;axe majeur.</translation>
+    </message>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un point d&apos;axe majeur.</translation>
+    </message>
+    <message>
+      <source>Major axis point</source>
+      <translation>Point du grand axe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:major_radius</name>
+    <message>
+      <source>Major radius</source>
+      <translation>Rayon majeur</translation>
+    </message>
+    <message>
+      <source>Set major radius</source>
+      <translation>Définir le rayon majeur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:major_radius:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Double n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:minor_radius</name>
+    <message>
+      <source>Minor radius</source>
+      <translation>Rayon mineur</translation>
+    </message>
+    <message>
+      <source>Set minor radius</source>
+      <translation>Définir le rayon mineur</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:minor_radius:GeomValidators_Positive</name>
+    <message>
+      <source>Double is not initialized.</source>
+      <translation>Double n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMacroEllipticArc:start_point</name>
+    <message>
+      <source>Attribute "%1" is locked by modification value in the viewer.</source>
+      <translation>L&apos;attribut &quot;%1&quot; est verrouillé par la valeur de modification dans la vue.</translation>
+    </message>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+  </context>
+  <context>
+    <name>workshop</name>
+    <message>
+      <source>Elliptic arc</source>
+      <translation>Arc elliptique</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMultiRotation</name>
+    <message>
+      <source>Angular copy</source>
+      <translation>Copie angulaire</translation>
+    </message>
+    <message>
+      <source>Copy objects and rotate</source>
+      <translation>Copier des objets et faire pivoter</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:AngleType</name>
+    <message>
+      <source>Full angle</source>
+      <translation>Angle complet</translation>
+    </message>
+    <message>
+      <source>Single angle</source>
+      <translation>Angle unique</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationAngle</name>
+    <message>
+      <source>Angle</source>
+      <translation>Angle</translation>
+    </message>
+    <message>
+      <source>Rotation angle</source>
+      <translation>Angle de rotation</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationCenter</name>
+    <message>
+      <source>Center of rotation</source>
+      <translation>Centre de rotation</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationList</name>
+    <message>
+      <source>Segments:</source>
+      <translation>Segments:</translation>
+    </message>
+    <message>
+      <source>Select list of objects to be rotated</source>
+      <translation>Sélectionnez la liste des objets à faire pivoter</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationObjects</name>
+    <message>
+      <source>Total number of objects</source>
+      <translation>Nombre total d&apos;objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiRotation:MultiRotationReversed</name>
+    <message>
+      <source>Reverse angular copy</source>
+      <translation>Copie angulaire inverse</translation>
+    </message>
+    <message>
+      <source>Reversed</source>
+      <translation>Renversé</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchMultiTranslation</name>
+    <message>
+      <source>Copy objects and move</source>
+      <translation>Copier des objets et les déplacer</translation>
+    </message>
+    <message>
+      <source>Direction</source>
+      <translation>Direction</translation>
+    </message>
+    <message>
+      <source>Linear copy</source>
+      <translation>Copie linéaire</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationEndPoint</name>
+    <message>
+      <source>End point</source>
+      <translation>Point final</translation>
+    </message>
+    <message>
+      <source>Final point of translation</source>
+      <translation>Dernier point de translation</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationList</name>
+    <message>
+      <source>Segments:</source>
+      <translation>Segments:</translation>
+    </message>
+    <message>
+      <source>Select list of objects to be translated</source>
+      <translation>Sélectionner la liste des objets à translater</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationObjects</name>
+    <message>
+      <source>Total number of objects</source>
+      <translation>Nombre total d&apos;objets</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:MultiTranslationStartPoint</name>
+    <message>
+      <source>Start point</source>
+      <translation>Point de départ</translation>
+    </message>
+    <message>
+      <source>Start point of translation</source>
+      <translation>Point de départ de la translation</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchMultiTranslation:ValueType</name>
+    <message>
+      <source>Full value</source>
+      <translation>Pleine valeur</translation>
+    </message>
+    <message>
+      <source>Single value</source>
+      <translation>Valeur unique</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchPoint</name>
+    <message>
+      <source>Create point</source>
+      <translation>Créer un point</translation>
+    </message>
+    <message>
+      <source>Point</source>
+      <translation>Point</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchPoint:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchProjection</name>
+    <message>
+      <source>Project feature onto sketch plane</source>
+      <translation>Projeter une entité sur un plan d&apos;esquisse</translation>
+    </message>
+    <message>
+      <source>Projection</source>
+      <translation>Projection</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchProjection:ExternalFeature</name>
+    <message>
+      <source>Object</source>
+      <translation>Objet</translation>
+    </message>
+    <message>
+      <source>Select external edge or vertex.</source>
+      <translation>Sélectionnez une arête externe ou un sommet.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchProjection:ExternalFeature:SketchPlugin_ProjectionValidator</name>
+    <message>
+      <source>The attribute with the %1 type is not processed</source>
+      <translation>Un argument de type %1 de la fonctionnalité de projection n&apos;est pas pris en charge</translation>
+    </message>
+    <message>
+      <source>The attribute %1 should be an edge or vertex</source>
+      <translation>L&apos;élément projeté doit être une arête ou un sommet</translation>
+    </message>
+    <message>
+      <source>There is no sketch referring to the current feature</source>
+      <translation>La fonction de projection n&apos;a pas d&apos;esquisse</translation>
+    </message>
+    <message>
+      <source>Unable to project feature from the same sketch</source>
+      <translation>Les fonctions de l&apos;esquisse en cours ne peuvent pas être projetées</translation>
+    </message>
+    <message>
+      <source>Error: Line is orthogonal to the sketch plane.</source>
+      <translation>Erreur : La ligne est orthogonale au plan d&apos;esquisse.</translation>
+    </message>
+    <message>
+      <source>Error: Circle is orthogonal to the sketch plane.</source>
+      <translation>Erreur : Le cercle est orthogonal au plan d&apos;esquisse.</translation>
+    </message>
+    <message>
+      <source>Error: Arc is orthogonal to the sketch plane.</source>
+      <translation>Erreur : L&apos;arc est orthogonal au plan d&apos;esquisse.</translation>
+    </message>
+    <message>
+      <source>Error: Ellipse is orthogonal to the sketch plane.</source>
+      <translation>Erreur : L’ellipse est orthogonal au plan d&apos;esquisse.</translation>
+    </message>
+    <message>
+      <source>Error: Elliptic Arc is orthogonal to the sketch plane.</source>
+      <translation>Erreur : L&apos;arc elliptique est orthogonal au plan d&apos;esquisse.</translation>
+    </message>
+    <message>
+      <source>Error: Selected object is not supported for projection.</source>
+      <translation>Erreur : L&apos;objet sélectionné n&apos;est pas pris en charge pour la projection.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchProjection:IncludeToResult</name>
+    <message>
+      <source>Include into the sketch result</source>
+      <translation>Inclure dans le résultat de l&apos;esquisse</translation>
+    </message>
+    <message>
+      <source>Include projected feature into the sketch result</source>
+      <translation>Inclure la fonctionnalité projetée dans le résultat de l&apos;esquisse</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchRectangle</name>
+    <message>
+      <source>Create rectangle</source>
+      <translation>Créer un rectangle</translation>
+    </message>
+    <message>
+      <source>Rectangle</source>
+      <translation>Rectangle</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchRectangle:Auxiliary</name>
+    <message>
+      <source>Auxiliary</source>
+      <translation>Auxiliaire</translation>
+    </message>
+    <message>
+      <source>Construction element</source>
+      <translation>Élément de construction</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchSplit</name>
+    <message>
+      <source>Cut selected segment arc or circle on existing coincident points</source>
+      <translation>Couper l&apos;arc ou le cercle du segment sélectionné sur les points coïncidents existants</translation>
+    </message>
+    <message>
+      <source>Split</source>
+      <translation>Diviser</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchSplit:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez un segment à diviser dans la vue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchSplit:SelectedObject</name>
+    <message>
+      <source>Segment</source>
+      <translation>Segment</translation>
+    </message>
+    <message>
+      <source>Select segment for split</source>
+      <translation>Sélectionnez le segment à diviser</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchSplit:SelectedObject:SketchPlugin_SplitValidator</name>
+    <message>
+      <source>Unknown error.</source>
+      <translation>Erreur inconnue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchSplit:SelectedObject</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionnez le segment à diviser</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>SketchTrim</name>
+    <message>
+      <source>Trim</source>
+      <translation>Réduire</translation>
+    </message>
+    <message>
+      <source>Trim selected segment arc or circle on intersection points nearest to the graphic selection</source>
+      <translation>Couper l&apos;arc ou le cercle du segment sélectionné sur les points d&apos;intersection les plus proches de la sélection graphique</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchTrim:Model_FeatureValidator</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>L&apos;attribut &quot;%1&quot; n&apos;est pas initialisé.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchTrim:SelectedObject</name>
+    <message>
+      <source>Segment</source>
+      <translation>Segment</translation>
+    </message>
+    <message>
+      <source>Select segment for trim</source>
+      <translation>Sélectionner un segment pour la coupe</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchTrim:SelectedObject:SketchPlugin_TrimValidator</name>
+    <message>
+      <source>Unknown error.</source>
+      <translation>Erreur inconnue.</translation>
+    </message>
+  </context>
+  <context>
+    <name>SketchTrim:SelectedObject</name>
+    <message>
+      <source>Attribute "%1" is not initialized.</source>
+      <translation>Sélectionner un segment pour la coupe</translation>
+    </message>
+  </context>
+
+</TS>
index 72e5e02322787366753fc443bb571aaec699fad5..0c77e447d5153401b62893cc661dca412ea02427 100644 (file)
@@ -189,7 +189,7 @@ class TestTangentEllipticArc(unittest.TestCase):
     self.myDOF += 4
     model.do()
 
-    self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
+    self.mySketch.setTangent(aLine.result(), self.myEllipticArc.result())
     self.myNbTangency += 1
     self.myDOF -= 1
     model.do()
diff --git a/src/SketchPlugin/Test/TestMoveEllipticArc.py b/src/SketchPlugin/Test/TestMoveEllipticArc.py
new file mode 100644 (file)
index 0000000..a1d02e6
--- /dev/null
@@ -0,0 +1,298 @@
+# Copyright (C) 2017-2019  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
+#
+
+"""
+    Test movement of the sketch ellipse
+"""
+
+import unittest
+import math
+from GeomAPI import GeomAPI_Pnt2d
+from SketchAPI import *
+from salome.shaper import model
+
+__updated__ = "2019-10-15"
+
+class TestMoveEllipticArc(unittest.TestCase):
+  def setUp(self):
+    model.begin()
+    self.myDocument = model.moduleDocument()
+    self.mySketch = model.addSketch(self.myDocument, model.defaultPlane("XOY"))
+    self.myCenter = GeomAPI_Pnt2d(70., 50.)
+    self.myAxisPoint = GeomAPI_Pnt2d(100., 70.)
+    self.myStartPoint = GeomAPI_Pnt2d(75., 75.)
+    self.myEndPoint = GeomAPI_Pnt2d(45., 55.)
+    macroEllipticArc = self.mySketch.addEllipticArc(self.myCenter, self.myAxisPoint, self.myStartPoint, self.myEndPoint, False)
+    self.myDOF = 7
+    model.do()
+    self.checkDOF()
+    self.myEllipticArc = SketchAPI_EllipticArc(model.lastSubFeature(self.mySketch, "SketchEllipticArc"))
+    self.myMajorRadius = self.myEllipticArc.majorRadius().value()
+    self.myMinorRadius = self.myEllipticArc.minorRadius().value()
+
+  def tearDown(self):
+    self.checkDOF()
+    self.checkPointOnEllipse(self.myEllipticArc.startPoint(), self.myEllipticArc)
+    self.checkPointOnEllipse(self.myEllipticArc.endPoint(), self.myEllipticArc)
+    model.end()
+
+  def checkDOF(self):
+    self.assertEqual(model.dof(self.mySketch), self.myDOF)
+
+  def checkPointCoordinates(self, thePoint, theCoordinates):
+    aCoord = []
+    if issubclass(type(theCoordinates), GeomAPI_Pnt2d):
+      aCoord = [theCoordinates.x(), theCoordinates.y()]
+    else:
+      aCoord = theCoordinates
+    DIGITS = 7 - math.floor(math.log10(math.hypot(aCoord[0], aCoord[1])))
+    self.assertAlmostEqual(thePoint.x(), aCoord[0], DIGITS)
+    self.assertAlmostEqual(thePoint.y(), aCoord[1], DIGITS)
+
+  def checkPointOnEllipse(self, theCoordinates, theEllipticArc):
+    point = GeomAPI_Pnt2d(theCoordinates.x(), theCoordinates.y())
+    firstFocus2d = GeomAPI_Pnt2d(theEllipticArc.firstFocus().x(), theEllipticArc.firstFocus().y())
+    distPF1 = model.distancePointPoint(firstFocus2d,  point)
+    secondFocus2d = GeomAPI_Pnt2d(theEllipticArc.secondFocus().x(), theEllipticArc.secondFocus().y())
+    distPF2 = model.distancePointPoint(secondFocus2d,  point)
+    self.assertAlmostEqual(distPF1 + distPF2, 2.0 * theEllipticArc.majorRadius().value(), 7 - math.floor(math.log10(theEllipticArc.majorRadius().value())))
+
+  def fixMajorRadius(self):
+    self.mySketch.setDistance(self.myEllipticArc.center(), self.myEllipticArc.majorAxisPositive(), self.myMajorRadius)
+    self.myDOF -= 1
+    model.do()
+    self.checkDOF()
+
+  def fixMinorRadius(self):
+    self.mySketch.setDistance(self.myEllipticArc.center(), self.myEllipticArc.minorAxisPositive(), self.myMinorRadius)
+    self.myDOF -= 1
+    model.do()
+    self.checkDOF()
+
+  def fixPoint(self, thePoint):
+    self.mySketch.setFixed(thePoint)
+    self.myDOF -= 2
+    model.do()
+    self.checkDOF()
+
+
+  def test_move_center_free_ellipse(self):
+    """ Test 1. Movement of central point of a free elliptic arc
+    """
+    newPosition = [self.myCenter.x() + 20., self.myCenter.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.center(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), newPosition)
+
+  def test_move_free_ellipse(self):
+    """ Test 2. Movement of a free ellipse dragging the edge
+    """
+    newPosition = GeomAPI_Pnt2d(110., 80.)
+    self.mySketch.move(self.myEllipticArc.defaultResult(), newPosition.x(), newPosition.y())
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), self.myCenter)
+    self.checkPointOnEllipse(newPosition, self.myEllipticArc)
+    self.assertNotEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertNotEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_center_ellipse_fixed_major_radius(self):
+    """ Test 3. Movement of central point of ellipse with fixed major radius
+    """
+    self.fixMajorRadius()
+
+    newPosition = [self.myCenter.x() + 20., self.myCenter.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.center(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), newPosition)
+    self.assertAlmostEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_ellipse_fixed_major_radius(self):
+    """ Test 4. Movement of ellipse with fixed major radius
+    """
+    self.fixMajorRadius()
+
+    newPosition = GeomAPI_Pnt2d(80., 80.)
+    self.mySketch.move(self.myEllipticArc.defaultResult(), newPosition.x(), newPosition.y())
+    model.do()
+    self.checkPointOnEllipse(newPosition, self.myEllipticArc)
+    self.assertNotEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertAlmostEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_center_ellipse_fixed_minor_radius(self):
+    """ Test 5. Movement of central point of ellipse with fixed minor radius
+    """
+    self.fixMinorRadius()
+
+    newPosition = [self.myCenter.x() + 20., self.myCenter.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.center(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), newPosition)
+    self.assertAlmostEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+
+  def test_move_ellipse_fixed_minor_radius(self):
+    """ Test 6. Movement of ellipse with fixed minor radius
+    """
+    self.fixMinorRadius()
+
+    newPosition = GeomAPI_Pnt2d(110., 80.)
+    self.mySketch.move(self.myEllipticArc.defaultResult(), newPosition.x(), newPosition.y())
+    model.do()
+    self.checkPointOnEllipse(newPosition, self.myEllipticArc)
+    self.assertAlmostEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertNotEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_center_ellipse_fixed_center(self):
+    """ Test 7. Movement of central point of ellipse with fixed center (nothing should be changed)
+    """
+    self.fixPoint(self.myEllipticArc.center())
+
+    newPosition = [self.myCenter.x() + 20., self.myCenter.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.center(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), self.myCenter)
+    self.assertAlmostEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertAlmostEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_ellipse_fixed_center(self):
+    """ Test 8. Movement of ellipse with fixed center
+    """
+    self.fixPoint(self.myEllipticArc.center())
+
+    newPosition = GeomAPI_Pnt2d(110., 80.)
+    self.mySketch.move(self.myEllipticArc.defaultResult(), newPosition.x(), newPosition.y())
+    model.do()
+    self.checkPointOnEllipse(newPosition, self.myEllipticArc)
+    self.assertNotEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertNotEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_center_ellipse_fixed_focus(self):
+    """ Test 9. Movement of central point of ellipse with fixed focus
+    """
+    focus = [self.myEllipticArc.firstFocus().x(), self.myEllipticArc.firstFocus().y()]
+    self.fixPoint(self.myEllipticArc.firstFocus())
+
+    newPosition = GeomAPI_Pnt2d(self.myCenter.x() + 20., self.myCenter.y() + 10.)
+    self.mySketch.move(self.myEllipticArc.center(), newPosition.x(), newPosition.y())
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), newPosition)
+    self.checkPointCoordinates(self.myEllipticArc.firstFocus(), focus)
+    self.assertNotEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertNotEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_focus_ellipse_fixed_focus(self):
+    """ Test 10. Movement of a focus point of ellipse with fixed focus (nothing should be changed)
+    """
+    focus = [self.myEllipticArc.firstFocus().x(), self.myEllipticArc.firstFocus().y()]
+    self.fixPoint(self.myEllipticArc.firstFocus())
+
+    newPosition = GeomAPI_Pnt2d(focus[0] + 10., focus[1] + 10.)
+    self.mySketch.move(self.myEllipticArc.firstFocus(), newPosition.x(), newPosition.y())
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.firstFocus(), focus)
+    self.assertAlmostEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertAlmostEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_ellipse_fixed_focus(self):
+    """ Test 11. Movement of ellipse with fixed focus
+    """
+    focus = [self.myEllipticArc.firstFocus().x(), self.myEllipticArc.firstFocus().y()]
+    self.fixPoint(self.myEllipticArc.firstFocus())
+
+    newPosition = GeomAPI_Pnt2d(80., 90.)
+    self.mySketch.move(self.myEllipticArc.defaultResult(), newPosition.x(), newPosition.y())
+    model.do()
+    self.checkPointOnEllipse(newPosition, self.myEllipticArc)
+    self.checkPointCoordinates(self.myEllipticArc.firstFocus(), focus)
+    self.assertNotEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+    self.assertNotEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+
+  def test_move_fixed_ellipse(self):
+    """ Test 12. Trying to move fully fixed ellipse
+    """
+    self.mySketch.setFixed(self.myEllipticArc.results()[-1])
+    self.myDOF -= 7
+    model.do()
+    self.checkDOF()
+
+    newPosition = [110., 80.]
+    self.mySketch.move(self.myEllipticArc.defaultResult(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), self.myCenter)
+    self.checkPointCoordinates(self.myEllipticArc.majorAxisPositive(), self.myAxisPoint)
+    self.checkPointCoordinates(self.myEllipticArc.startPoint(), self.myStartPoint)
+    self.checkPointCoordinates(self.myEllipticArc.endPoint(), self.myEndPoint)
+    self.assertAlmostEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+    self.assertAlmostEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+
+  def test_move_start_point_free_ellipse(self):
+    """ Test 13. Trying to move start point of elliptic arc
+    """
+    newPosition = [self.myStartPoint.x() + 10., self.myStartPoint.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.startPoint(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.startPoint(), newPosition)
+
+  def test_move_end_point_free_ellipse(self):
+    """ Test 14. Trying to move end point of elliptic arc
+    """
+    newPosition = [self.myEndPoint.x() - 10., self.myEndPoint.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.endPoint(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.endPoint(), newPosition)
+
+  def test_move_start_point_fixed_ellipse(self):
+    """ Test 15. Trying to move start point of fully fixed ellipse
+    """
+    self.mySketch.setFixed(self.myEllipticArc.results()[-1])
+    self.myDOF -= 7
+    model.do()
+    self.checkDOF()
+
+    newPosition = [self.myStartPoint.x() + 10., self.myStartPoint.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.startPoint(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), self.myCenter)
+    self.checkPointCoordinates(self.myEllipticArc.majorAxisPositive(), self.myAxisPoint)
+    self.checkPointCoordinates(self.myEllipticArc.startPoint(), self.myStartPoint)
+    self.checkPointCoordinates(self.myEllipticArc.endPoint(), self.myEndPoint)
+    self.assertAlmostEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+    self.assertAlmostEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+
+  def test_move_end_point_fixed_ellipse(self):
+    """ Test 16. Trying to move end point of fully fixed ellipse
+    """
+    self.mySketch.setFixed(self.myEllipticArc.results()[-1])
+    self.myDOF -= 7
+    model.do()
+    self.checkDOF()
+
+    newPosition = [self.myEndPoint.x() - 10., self.myEndPoint.y() + 10.]
+    self.mySketch.move(self.myEllipticArc.endPoint(), newPosition[0], newPosition[1])
+    model.do()
+    self.checkPointCoordinates(self.myEllipticArc.center(), self.myCenter)
+    self.checkPointCoordinates(self.myEllipticArc.majorAxisPositive(), self.myAxisPoint)
+    self.checkPointCoordinates(self.myEllipticArc.startPoint(), self.myStartPoint)
+    self.checkPointCoordinates(self.myEllipticArc.endPoint(), self.myEndPoint)
+    self.assertAlmostEqual(self.myEllipticArc.majorRadius().value(), self.myMajorRadius)
+    self.assertAlmostEqual(self.myEllipticArc.minorRadius().value(), self.myMinorRadius)
+
+
+if __name__ == "__main__":
+    test_program = unittest.main(exit=False)
+    assert test_program.result.wasSuccessful(), "Test failed"
diff --git a/src/SketchPlugin/Test/TestRemainingDoF.py b/src/SketchPlugin/Test/TestRemainingDoF.py
new file mode 100644 (file)
index 0000000..539c2df
--- /dev/null
@@ -0,0 +1,65 @@
+# Copyright (C) 2019  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
+#
+
+from salome.shaper import model
+
+from EventsAPI import *
+from ModelAPI import *
+
+class FreeShapesListener(EventsAPI.Events_Listener):
+    def __init__(self):
+        Events_Listener.__init__(self)
+        # register as a listener
+        Events_Loop.loop().registerListener(self, Events_Loop.eventByName("DoFObjects"))
+        self.myEventProcessed = False
+
+    def __del__(self):
+        Events_Loop.loop().removeListener(self)
+
+    def processEvent(self, theMessage):
+        message = messageToUpdatedMessage(theMessage)
+        objs = message.objects()
+        assert(len(objs) == 1)
+        assert(objectToFeature(objs[0]).getKind() == "SketchCircle")
+        self.myEventProcessed = True
+
+
+if __name__ == "__main__":
+    # create the listener
+    listener = FreeShapesListener()
+
+    model.begin()
+    partSet = model.moduleDocument()
+    Sketch_1 = model.addSketch(partSet, model.defaultPlane("XOY"))
+    SketchCircle_1 = Sketch_1.addCircle(-30, 0, 14)
+    SketchLine_1 = Sketch_1.addLine(-30, 0, 0, 0)
+    SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchCircle_1.center(), SketchLine_1.startPoint())
+    SketchProjection_1 = Sketch_1.addProjection(model.selection("VERTEX", "Origin"), False)
+    SketchPoint_1 = SketchProjection_1.createdFeature()
+    SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchPoint_1.result())
+    SketchConstraintHorizontal_1 = Sketch_1.setHorizontal(SketchLine_1.result())
+    SketchConstraintLength_1 = Sketch_1.setLength(SketchLine_1.result(), 30)
+    model.end()
+
+    # send message to find the free shapes in the sketch
+    event = Events_Loop.eventByName("GetDoFObjects")
+    ModelAPI_EventCreator.get().sendUpdated(Sketch_1.feature(), event);
+    Events_Loop.loop().flush(event);
+
+    assert(listener.myEventProcessed)
index eef35764893f6b9a8407b37b0b0262a9f1d89fe4..d1a9378d4162e996f16e2beaa445580045be0a2f 100644 (file)
@@ -35,7 +35,7 @@
                 helpfile="pointFeature.html">
         <sketch-2dpoint_selector id="PointCoordinates" accept_expressions="0" title="Point" tooltip="Point coordinates"
                                  enable_value="enable_by_preferences"/>
-        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0"/>
+        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0" change_visual_attributes="true"/>
       </feature>
 
       <!-- SketchLine -->
@@ -47,7 +47,7 @@
                                  enable_value="enable_by_preferences"/>
         <labelvalue id="LineLength" accept_expressions="0" label="Length" default="computed" icon="icons/Sketch/distance_value.png"
                      tooltip="Line length" obligatory="0" enable_value="false"/>
-        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0"/>
+        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0" change_visual_attributes="true"/>
         <validator id="GeomValidators_Different" parameters="StartPoint,EndPoint"/>
       </feature>
     </group>
@@ -71,7 +71,7 @@
                     accept_expressions="0"
                     enable_value="enable_by_preferences">
         </labelvalue>
-        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0"/>
+        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0" change_visual_attributes="true"/>
       </feature>
       <!-- SketchMacroCircle -->
       <feature id="SketchMacroCircle"
                    tooltip="Construction element"
                    label="Auxiliary"
                    default="false"
-                   obligatory="0"/>
+                   obligatory="0"
+                   change_visual_attributes="true"/>
       </feature>
 
       <!-- SketchArc -->
                    label="Auxiliary"
                    tooltip="Construction element"
                    default="false"
-                   obligatory="0"/>
+                   obligatory="0"
+                   change_visual_attributes="true"/>
       </feature>
 
       <!-- SketchMacroArc -->
                    label="Auxiliary"
                    tooltip="Construction element"
                    default="false"
-                   obligatory="0"/>
+                   obligatory="0"
+                   change_visual_attributes="true"/>
       </feature>
 
       <!--  SketchFillet  -->
                     accept_expressions="0"
                     enable_value="enable_by_preferences">
         </labelvalue>
-        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0"/>
+        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0" change_visual_attributes="true"/>
       </feature>
       <!-- SketchMacroEllipse -->
       <feature id="SketchMacroEllipse"
                    tooltip="Construction element"
                    label="Auxiliary"
                    default="false"
-                   obligatory="0"/>
+                   obligatory="0"
+                   change_visual_attributes="true"/>
       </feature>
 
       <!-- SketchEllipticArc is a hidden feature. It is created inside SketchMacroEllipse. -->
                     accept_expressions="0"
                     enable_value="enable_by_preferences">
         </labelvalue>
-        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0"/>
+        <boolvalue id="Auxiliary" label="Auxiliary" default="false" tooltip="Construction element" obligatory="0" change_visual_attributes="true"/>
       </feature>
       <!-- SketchMacroEllipticArc -->
       <feature id="SketchMacroEllipticArc"
                    tooltip="Construction element"
                    label="Auxiliary"
                    default="false"
-                   obligatory="0"/>
+                   obligatory="0"
+                   change_visual_attributes="true"/>
       </feature>
     </group>
 
               use_sketch_plane="false">
           <validator id="SketchPlugin_ProjectionValidator"/>
         </sketch_shape_selector>
-        <boolvalue id="IncludeToResult" label="Include into the sketch result" default="true" tooltip="Include projected feature into the sketch result"/>
+        <boolvalue id="IncludeToResult" label="Include into the sketch result" default="true" tooltip="Include projected feature into the sketch result"
+                   change_visual_attributes="true"/>
         <validator id="PartSet_ProjectionSelection"/>
       </feature>
 
               use_sketch_plane="false">
           <validator id="SketchPlugin_IntersectionValidator"/>
         </sketch_shape_selector>
-        <boolvalue id="IncludeToResult" label="Include into the sketch result" default="true" tooltip="Include projected feature into the sketch result"/>
+        <boolvalue id="IncludeToResult" label="Include into the sketch result" default="true" tooltip="Include projected feature into the sketch result"
+                   change_visual_attributes="true"/>
         <validator id="PartSet_IntersectionSelection"/>
       </feature>
     </group>
index 90e3ca7fb10dc372efde8d1813980d3ee467b2b6..fafa0372ac5780f3b4d4905d4985d8a3f2498eca 100644 (file)
@@ -93,6 +93,7 @@ SET(SKETCHSOLVER_LIBRARIES
 
 SET(SKETCHSOLVER_TEXT_RESOURCES
     SketchSolver_msg_en.ts
+    SketchSolver_msg_fr.ts
 )
 
 INCLUDE_DIRECTORIES(
index 416b338b05d4dadbedc3a8da7686886c34ece178..30b12ec7b20b962c9249f8da229c66e1dad2675a 100644 (file)
@@ -62,11 +62,11 @@ void PlaneGCSSolver_Solver::addConstraint(const ConstraintID& theMultiConstraint
     GCSConstraintPtr aConstraint = *anIt;
     aConstraint->setTag(anID);
     myEquationSystem->addConstraint(aConstraint.get());
-    myConstraints[theMultiConstraintID].insert(aConstraint);
 
     if (anID > CID_UNKNOWN)
       ++anID;
   }
+  myConstraints[theMultiConstraintID] = theConstraints;
 
   if (theMultiConstraintID >= CID_UNKNOWN)
     myDOF = -1;
@@ -77,7 +77,7 @@ void PlaneGCSSolver_Solver::removeConstraint(const ConstraintID& theID)
 {
   ConstraintMap::iterator aFound = myConstraints.find(theID);
   if (aFound != myConstraints.end()) {
-    for (std::set<GCSConstraintPtr>::iterator anIt = aFound->second.begin();
+    for (std::list<GCSConstraintPtr>::iterator anIt = aFound->second.begin();
          anIt != aFound->second.end(); ++anIt)
       myEquationSystem->clearByTag((*anIt)->getTag());
 
@@ -243,6 +243,32 @@ void PlaneGCSSolver_Solver::diagnose(const GCS::Algorithm& theAlgo)
   myDiagnoseBeforeSolve = false;
 }
 
+void PlaneGCSSolver_Solver::getFreeParameters(GCS::VEC_pD& theFreeParams)
+{
+  if (myConstraints.empty())
+    theFreeParams = myParameters;
+  else {
+    GCS::VEC_pD aParametersCopy = myParameters;
+    ConstraintMap aConstraintCopy = myConstraints;
+
+    // clear the set of equations
+    clear();
+    // reset constraints
+    myParameters = aParametersCopy;
+    for (ConstraintMap::iterator anIt = aConstraintCopy.begin();
+         anIt != aConstraintCopy.end(); ++anIt)
+      addConstraint(anIt->first, anIt->second);
+
+    // parameters detection works for Dense QR only
+    GCS::QRAlgorithm aQRAlgo = myEquationSystem->qrAlgorithm;
+    myEquationSystem->qrAlgorithm = GCS::EigenDenseQR;
+    diagnose();
+    myEquationSystem->getDependentParams(theFreeParams);
+    // revert QR decomposition algorithm
+    myEquationSystem->qrAlgorithm = aQRAlgo;
+  }
+}
+
 void PlaneGCSSolver_Solver::addFictiveConstraintIfNecessary()
 {
   bool hasOnlyMovement = true;
index 4fb2abce9eafd65f615cecdbf8d6941eb84a0430..290136b25cec55f58eaacc0864ababe7afa8dbc1 100644 (file)
@@ -79,6 +79,9 @@ public:
   /// \brief Check conflicting/redundant constraints and DoF
   void diagnose(const GCS::Algorithm& theAlgo = GCS::DogLeg);
 
+  /// \brief Return the list of modifiable parameters
+  void getFreeParameters(GCS::VEC_pD& theFreeParams);
+
   /// \brief Degrees of freedom
   int dof();
 
@@ -91,7 +94,7 @@ private:
   void removeFictiveConstraint();
 
 private:
-  typedef std::map<ConstraintID, std::set<GCSConstraintPtr> > ConstraintMap;
+  typedef std::map<ConstraintID, std::list<GCSConstraintPtr> > ConstraintMap;
 
   GCS::VEC_pD                  myParameters;     ///< list of unknowns
   ConstraintMap                myConstraints;    ///< list of constraints
index 4f546aacce57e886154834202d6e9f626bccaec8..833e1535284015a86aaa0d9d9d4f9c9aad0b528c 100644 (file)
@@ -654,3 +654,29 @@ PlaneGCSSolver_Solver::SolveStatus PlaneGCSSolver_Storage::checkDegeneratedGeome
   }
   return PlaneGCSSolver_Solver::STATUS_OK;
 }
+
+
+void PlaneGCSSolver_Storage::getUnderconstrainedGeometry(std::set<ObjectPtr>& theFeatures) const
+{
+  std::vector<double*> aFreeParams;
+  mySketchSolver->getFreeParameters(aFreeParams);
+  if (aFreeParams.empty())
+    return;
+
+  std::map<double*, FeaturePtr> aParamOfFeatures;
+  for (std::map<FeaturePtr, EntityWrapperPtr>::const_iterator aFIt = myFeatureMap.begin();
+       aFIt != myFeatureMap.end(); ++aFIt) {
+    if (!aFIt->second)
+      continue;
+    GCS::SET_pD aParams = PlaneGCSSolver_Tools::parameters(aFIt->second);
+    for (GCS::SET_pD::iterator aPIt = aParams.begin(); aPIt != aParams.end(); ++aPIt)
+      aParamOfFeatures[*aPIt] = aFIt->first;
+  }
+
+  for (std::vector<double*>::iterator anIt = aFreeParams.begin();
+       anIt != aFreeParams.end(); ++anIt) {
+    std::map<double*, FeaturePtr>::iterator aFound = aParamOfFeatures.find(*anIt);
+    if (aFound != aParamOfFeatures.end())
+      theFeatures.insert(aFound->second);
+  }
+}
index eafa686c47620bee46177f3dd8d7568fbf534955..8d452a85749a10032aa4098f74b26b0ce91fe9e7 100644 (file)
@@ -95,6 +95,9 @@ public:
   ///        Reversed arcs should have the last parameter lesser than the first parameter.
   virtual void adjustParametrizationOfArcs();
 
+  /// \brief Return list of features which are not fully constrained
+  virtual void getUnderconstrainedGeometry(std::set<ObjectPtr>& theFeatures) const;
+
 private:
   /// \brief Convert feature using specified builder.
   EntityWrapperPtr createFeature(const FeaturePtr&             theFeature,
index ab9b38fc2df6789e841b275e22e425f2805d9e19..96c0a29687a66e1008520dd4d398e5244df9ce18 100644 (file)
@@ -496,3 +496,8 @@ bool SketchSolver_Group::areConstraintsValid() const
       return false;
   return true;
 }
+
+void SketchSolver_Group::underconstrainedFeatures(std::set<ObjectPtr>& theFeatures) const
+{
+  myStorage->getUnderconstrainedGeometry(theFeatures);
+}
index ed938f5d0c45f9c9749cf88d06a04650f49457f3..45407ddb8f47884f6dbc4efb5a4ede2d0a567a25 100644 (file)
@@ -115,6 +115,9 @@ class SketchSolver_Group
    */
   bool resolveConstraints();
 
+  /// \brief Find the list of features, which are not fully constrained.
+  void underconstrainedFeatures(std::set<ObjectPtr>& theFeatures) const;
+
   /// \brief Block or unblock events sent by features in this group
   void blockEvents(bool isBlocked);
 
index 00be4b13ef380f8f4151421c488062db0d608331..a9d47533e95b12fb5cb18ad2dc632add3e8c13a5 100644 (file)
@@ -114,6 +114,7 @@ SketchSolver_Manager::SketchSolver_Manager()
   ////Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_SOLVER_FAILED));
   ////Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_SOLVER_REPAIRED));
   Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_SKETCH_PREPARED));
+  Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_GET_DOF_OBJECTS));
 }
 
 SketchSolver_Manager::~SketchSolver_Manager()
@@ -223,6 +224,35 @@ void SketchSolver_Manager::processEvent(
     }
     myIsComputed = false;
   }
+  else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_GET_DOF_OBJECTS)) {
+    std::shared_ptr<ModelAPI_ObjectUpdatedMessage> anUpdateMsg =
+      std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+    std::set<ObjectPtr> aObjects = anUpdateMsg->objects();
+    if (aObjects.size() == 1) {
+      std::set<ObjectPtr>::const_iterator aIt;
+      for (aIt = aObjects.cbegin(); aIt != aObjects.cend(); aIt++) {
+        CompositeFeaturePtr aFeature =
+            std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(*aIt);
+        if (aFeature) {
+          SketchGroupPtr aGroup = findGroup(aFeature);
+
+          std::set<ObjectPtr> aFreeFeatures;
+          aGroup->underconstrainedFeatures(aFreeFeatures);
+
+          std::list<ObjectPtr> aFeatures;
+          std::set<ObjectPtr>::const_iterator aIt;
+          for (aIt = aFreeFeatures.cbegin(); aIt != aFreeFeatures.cend(); ++aIt) {
+            aFeatures.push_back(*aIt);
+          }
+
+          // send features to GUI
+          static const Events_ID anEvent = Events_Loop::eventByName(EVENT_DOF_OBJECTS);
+          ModelAPI_EventCreator::get()->sendUpdated(aFeatures, anEvent);
+          Events_Loop::loop()->flush(anEvent);
+        }
+      }
+    }
+  }
 
   // resolve constraints if needed
   bool needToUpdate = needToResolve && resolveConstraints();
@@ -352,7 +382,7 @@ bool SketchSolver_Manager::moveAttribute(
 //  Purpose:  search groups of entities interacting with given feature
 // ============================================================================
 SketchGroupPtr SketchSolver_Manager::findGroup(
-    std::shared_ptr<SketchPlugin_Feature> theFeature)
+  std::shared_ptr<SketchPlugin_Feature> theFeature)
 {
   if (!isFeatureValid(theFeature))
     return SketchGroupPtr(); // do not process wrong features
@@ -368,17 +398,21 @@ SketchGroupPtr SketchSolver_Manager::findGroup(
       break;
     }
   }
+  return findGroup(aSketch);
+}
 
-  if (!aSketch)
+SketchGroupPtr SketchSolver_Manager::findGroup(CompositeFeaturePtr theSketch)
+{
+  if (!theSketch)
     return SketchGroupPtr(); // not a sketch's feature
 
   std::list<SketchGroupPtr>::const_iterator aGroupIt;
   for (aGroupIt = myGroups.begin(); aGroupIt != myGroups.end(); ++aGroupIt)
-    if ((*aGroupIt)->getWorkplane() == aSketch)
+    if ((*aGroupIt)->getWorkplane() == theSketch)
       return *aGroupIt;
 
   // group for the sketch does not created yet
-  SketchGroupPtr aNewGroup = SketchGroupPtr(new SketchSolver_Group(aSketch));
+  SketchGroupPtr aNewGroup = SketchGroupPtr(new SketchSolver_Group(theSketch));
   myGroups.push_back(aNewGroup);
   return aNewGroup;
 }
index ce83c3d9b9355c01143917f250c8c47e0200b1aa..78ddaefbb26c2d99811bb51d0462d4564519ace8 100644 (file)
@@ -112,6 +112,11 @@ private:
    *  \return Pointer to corresponding group or NULL if the group cannot be created.
    */
   SketchGroupPtr findGroup(std::shared_ptr<SketchPlugin_Feature> theFeature);
+  /** \brief Searches group related to specified composite feature
+   *  \param[in]  theSketch  sketch to be found
+   *  \return Pointer to corresponding group or NULL if the group cannot be created.
+   */
+  SketchGroupPtr findGroup(std::shared_ptr<ModelAPI_CompositeFeature> theSketch);
 
   /// \brief Stop sending the Update event until all features updated
   /// \return \c true, if the last flushed event is Update
index 0757abfb7f2abf3f060ff3559a7fec4f09f70831..8ef8aeb39c3415324f1622776661d9d45b2246e9 100644 (file)
@@ -128,6 +128,9 @@ public:
   /// \brief Return list of conflicting constraints
   std::set<ObjectPtr> getConflictingConstraints(SolverPtr theSolver) const;
 
+  /// \brief Return list of features which are not fully constrained
+  virtual void getUnderconstrainedGeometry(std::set<ObjectPtr>& theFeatures) const = 0;
+
   /// \brief Verify, the sketch contains degenerated geometry
   ///        after resolving the set of constraints
   /// \return STATUS_OK if the geometry is valid, STATUS_DEGENERATED otherwise.
diff --git a/src/SketchSolver/SketchSolver_msg_fr.ts b/src/SketchSolver/SketchSolver_msg_fr.ts
new file mode 100644 (file)
index 0000000..a69ecbe
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr_FR">
+  <context>
+    <name>Sketch</name>
+    <message>
+      <source>The constraint is conflicting with others. To fix this, you can either undo your operation or remove a conflicting constraint.</source>
+      <translation>La contrainte est en conflit avec les autres. Pour résoudre ce problème, vous pouvez annuler votre opération ou supprimer une contrainte en conflit.</translation>
+    </message>
+    <message>
+      <source>There is a circular reference between copied sketch entities and their originals. To fix this, you can either undo your operation or remove wrong constraint.</source>
+      <translation>Il existe une référence circulaire entre les entités d&apos;esquisse copiées et leurs originaux. Pour résoudre ce problème, vous pouvez annuler votre opération ou supprimer une contrainte incorrecte.</translation>
+    </message>
+    <message>
+      <source>Caution: SolveSpace crashed! Constraints are wrong</source>
+      <translation>Attention : Plantage de SolveSpace ! Les contraintes sont fausses</translation>
+    </message>
+    <message>
+      <source>The set of constraints lead to degenerated geometry. To fix this, you can either undo your operation or remove a constraint or the degenerated geometry.</source>
+      <translation>L&apos;ensemble des contraintes conduit à une géométrie dégénérée. Pour résoudre ce problème, vous pouvez annuler votre opération ou supprimer une contrainte ou la géométrie dégénérée..</translation>
+    </message>
+  </context>
+</TS>
index cf51cc8b29ba01c777d4a5db8cf68cf33d18d8f7..2d9b66911da9c5bef275acb654db63115a987749 100644 (file)
@@ -36,7 +36,6 @@ SET(PROJECT_HEADERS
     XGUI_ActiveControlSelector.h
     XGUI_ColorDialog.h
     XGUI_ContextMenuMgr.h
-    XGUI_CustomPrs.h
     XGUI_DataModel.h
     XGUI_DeflectionDialog.h
     XGUI_Displayer.h
@@ -104,7 +103,6 @@ SET(PROJECT_SOURCES
     XGUI_ActiveControlMgr.cpp
     XGUI_ColorDialog.cpp
     XGUI_ContextMenuMgr.cpp
-    XGUI_CustomPrs.cpp
     XGUI_DataModel.cpp
     XGUI_DeflectionDialog.cpp
     XGUI_Displayer.cpp
@@ -145,7 +143,7 @@ SET(PREFERENCES_XML
 )
 
 SET(TEXT_RESOURCES
-#    XGUI_msg_fr.ts
+    XGUI_msg_fr.ts
 )
 
 SET(PROJECT_LIBRARIES
@@ -179,14 +177,16 @@ QT_ADD_RESOURCES(PROJECT_COMPILED_RESOURCES ${PROJECT_RESOURCES})
 
 
 IF (${UPDATE_TRANSLATION})
-    SET(PROJECT_FILES ${PROJECT_SOURCES} ${ROJECT_HEADERS} )
+    SET(PROJECT_FILES ${PROJECT_SOURCES} ${PROJECT_HEADERS} )
     QT5_CREATE_TRANSLATION(QM_RESOURCES
                            ${PROJECT_FILES}
                            ${TEXT_RESOURCES}
                            OPTIONS -extensions cpp -no-recursive
                           )
 ELSE(${UPDATE_TRANSLATION})
-    QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    IF(${MAKE_TRANSLATION})
+        QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES})
+    ENDIF(${MAKE_TRANSLATION})
 ENDIF(${UPDATE_TRANSLATION})
 
 
diff --git a/src/XGUI/XGUI_CustomPrs.cpp b/src/XGUI/XGUI_CustomPrs.cpp
deleted file mode 100644 (file)
index f3bd683..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright (C) 2014-2019  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
-//
-
-#include <XGUI_CustomPrs.h>
-#include <XGUI_Workshop.h>
-#include <XGUI_Displayer.h>
-
-#include <ModuleBase_IModule.h>
-
-#include <ModelAPI_AttributeIntArray.h>
-#include <ModelAPI_AttributeDouble.h>
-#include <ModelAPI_Session.h>
-#include <ModelAPI_ResultBody.h>
-#include <ModelAPI_ResultConstruction.h>
-
-#include <GeomAPI_ShapeExplorer.h>
-
-#include <Config_PropManager.h>
-
-#include <Events_InfoMessage.h>
-
-#include <vector>
-#include <QColor>
-
-double getDeflection(const ResultPtr& theResult)
-{
-  double aDeflection = -1;
-  // get deflection from the attribute of the result
-  if (theResult.get() != NULL &&
-      theResult->data()->attribute(ModelAPI_Result::DEFLECTION_ID()).get() != NULL) {
-    AttributeDoublePtr aDoubleAttr = theResult->data()->real(ModelAPI_Result::DEFLECTION_ID());
-    if (aDoubleAttr.get() && aDoubleAttr->isInitialized()) {
-      double aValue = aDoubleAttr->value();
-      if (aValue > 0) /// zero value should not be used as a deflection(previous studies)
-        aDeflection = aDoubleAttr->value();
-    }
-  }
-  return aDeflection;
-}
-
-void getColor(const ResultPtr& theResult, std::vector<int>& theColor)
-{
-  theColor.clear();
-  // get color from the attribute of the result
-  if (theResult.get() != NULL &&
-      theResult->data()->attribute(ModelAPI_Result::COLOR_ID()).get() != NULL) {
-    AttributeIntArrayPtr aColorAttr = theResult->data()->intArray(ModelAPI_Result::COLOR_ID());
-    if (aColorAttr.get() && aColorAttr->size()) {
-      theColor.push_back(aColorAttr->value(0));
-      theColor.push_back(aColorAttr->value(1));
-      theColor.push_back(aColorAttr->value(2));
-    }
-  }
-}
-
-void XGUI_CustomPrs::getDefaultColor(ObjectPtr theObject, const bool isEmptyColorValid,
-                                     std::vector<int>& theColor)
-{
-  theColor.clear();
-  // get default color from the preferences manager for the given result
-  if (theColor.empty()) {
-    std::string aSection, aName, aDefault;
-    theObject->colorConfigInfo(aSection, aName, aDefault);
-    if (!aSection.empty() && !aName.empty()) {
-      theColor = Config_PropManager::color(aSection, aName);
-    }
-  }
-  if (!isEmptyColorValid && theColor.empty()) {
-    // all AIS objects, where the color is not set, are in black.
-    // The color should be defined in XML or set in the attribute
-    theColor = Config_PropManager::color("Visualization", "object_default_color");
-    Events_InfoMessage("XGUI_CustomPrs",
-      "A default color is not defined in the preferences for this kind of result").send();
-  }
-}
-
-double XGUI_CustomPrs::getDefaultDeflection(const ObjectPtr& theObject)
-{
-  double aDeflection = -1;
-  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
-  if (aResult.get()) {
-    bool isConstruction = false;
-
-    std::string aResultGroup = aResult->groupName();
-    if (aResultGroup == ModelAPI_ResultConstruction::group())
-      isConstruction = true;
-    else if (aResultGroup == ModelAPI_ResultBody::group()) {
-      GeomShapePtr aGeomShape = aResult->shape();
-      if (aGeomShape.get()) {
-        // if the shape could not be exploded on faces, it contains only wires, edges, and vertices
-        // correction of deviation for them should not influence to the application performance
-        GeomAPI_ShapeExplorer anExp(aGeomShape, GeomAPI_Shape::FACE);
-        isConstruction = !anExp.more();
-      }
-    }
-    if (isConstruction)
-      aDeflection = Config_PropManager::real("Visualization", "construction_deflection");
-    else
-      aDeflection = Config_PropManager::real("Visualization", "body_deflection");
-  }
-  return aDeflection;
-}
-
-double getTransparency(const ResultPtr& theResult)
-{
-  double aTransparency = -1;
-  // get transparency from the attribute of the result
-  if (theResult.get() != NULL &&
-      theResult->data()->attribute(ModelAPI_Result::TRANSPARENCY_ID()).get() != NULL) {
-    AttributeDoublePtr aDoubleAttr = theResult->data()->real(ModelAPI_Result::TRANSPARENCY_ID());
-    if (aDoubleAttr.get() && aDoubleAttr->isInitialized()) {
-      aTransparency = aDoubleAttr->value();
-    }
-  }
-  return aTransparency;
-}
-
-double getDefaultTransparency(const ResultPtr& theResult)
-{
-  return Config_PropManager::integer("Visualization", "shaper_default_transparency") / 100.;
-}
-
-XGUI_CustomPrs::XGUI_CustomPrs(XGUI_Workshop* theWorkshop)
-: myWorkshop(theWorkshop)
-{
-}
-
-void XGUI_CustomPrs::getResultColor(const ResultPtr& theResult, std::vector<int>& theColor)
-{
-  getColor(theResult, theColor);
-  if (theColor.empty())
-    getDefaultColor(theResult, false, theColor);
-}
-
-double XGUI_CustomPrs::getResultDeflection(const ResultPtr& theResult)
-{
-  double aDeflection = getDeflection(theResult);
-  if (aDeflection < 0)
-    aDeflection = getDefaultDeflection(theResult);
-  return aDeflection;
-}
-
-double XGUI_CustomPrs::getResultTransparency(const ResultPtr& theResult)
-{
-  double aTransparency = getTransparency(theResult);
-  if (aTransparency < 0)
-    aTransparency = getDefaultTransparency(theResult);
-  return aTransparency;
-}
-
-bool XGUI_CustomPrs::customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
-                                           std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs)
-{
-  bool aCustomized = false;
-  if (theResult.get()) {
-    std::vector<int> aColor;
-    getResultColor(theResult, aColor);
-
-    SessionPtr aMgr = ModelAPI_Session::get();
-    if (aMgr->activeDocument() != theResult->document()) {
-      QColor aQColor(aColor[0], aColor[1], aColor[2]);
-      QColor aNewColor =
-        QColor::fromHsvF(aQColor.hueF(), aQColor.saturationF()/3., aQColor.valueF());
-      aColor[0] = aNewColor.red();
-      aColor[1] = aNewColor.green();
-      aColor[2] = aNewColor.blue();
-    }
-    aCustomized = !aColor.empty() && thePrs->setColor(aColor[0], aColor[1], aColor[2]);
-
-    aCustomized = thePrs->setDeflection(getResultDeflection(theResult)) | aCustomized;
-
-    aCustomized = thePrs->setTransparency(getResultTransparency(theResult)) | aCustomized;
-  }
-  ModuleBase_IModule* aModule = myWorkshop->module();
-  aCustomized = aModule->customisePresentation(theResult, thePrs, theCustomPrs) || aCustomized;
-  return aCustomized;
-}
diff --git a/src/XGUI/XGUI_CustomPrs.h b/src/XGUI/XGUI_CustomPrs.h
deleted file mode 100644 (file)
index 62d18d3..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (C) 2014-2019  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
-//
-
-#ifndef XGUI_CustomPrs_H
-#define XGUI_CustomPrs_H
-
-#include "XGUI.h"
-#include <GeomAPI_ICustomPrs.h>
-#include <GeomAPI_AISObject.h>
-#include <ModelAPI_Result.h>
-
-class XGUI_Workshop;
-
-/**
-* Interface of a class which can provide specific customization of
-* object presentation
-*/ 
-class XGUI_CustomPrs : public GeomAPI_ICustomPrs
-{
-public:
-  /// Constructor
-  /// \param theWorkshop the current workshop instance
-  XGUI_EXPORT XGUI_CustomPrs(XGUI_Workshop* theWorkshop);
-
-  XGUI_EXPORT virtual ~XGUI_CustomPrs() {};
-
-  /// Modifies the given presentation in the custom way.
-  virtual bool customisePresentation(ResultPtr theResult, AISObjectPtr thePrs,
-                                     std::shared_ptr<GeomAPI_ICustomPrs> theCustomPrs);
-
-  /// Returns color of a result object
-  /// \param theResult a result object
-  /// \param theColor a color in form of RGB vector
-  static void getResultColor(const ResultPtr& theResult, std::vector<int>& theColor);
-
-  /// Returns deflection of a result object
-  /// \param theResult a result object
-  /// \return theDeflection a real value
-  static double getResultDeflection(const ResultPtr& theResult);
-
-  /// Returns transparency of a result object
-  /// \param theResult a result object
-  /// \return theTransparency a real value
-  static double getResultTransparency(const ResultPtr& theResult);
-
-  /// Returns the default object color. It obtains colorConfigInfo of the object
-  /// and find it in preferences. If there are no this color in preference and an empty
-  /// color is interpreted as invalid, it shows error message
-  /// \param theObject an investigated object
-  /// \param isEmptyColorValid boolean state about interpretation of empty color
-  /// \param theColor the result color
-  static void XGUI_EXPORT getDefaultColor(ObjectPtr theObject, const bool isEmptyColorValid,
-                                          std::vector<int>& theColor);
-
-  /// Returns the default deflection value. The value is obtained from the application preferences
-  /// \param theObject an investigated object
-  /// \return deflection value
-  static double XGUI_EXPORT getDefaultDeflection(const ObjectPtr& theObject);
-
-protected:
-  XGUI_Workshop* myWorkshop; ///< the current workshop
-};
-
-#endif
index ccad93e0e2325f4d0a776c4c8a9044ebb5b3af85..c96dd3e7c5da6069654347f5919aa02fd7961f97 100644 (file)
@@ -19,7 +19,6 @@
 
 #include "XGUI_Displayer.h"
 
-#include "XGUI_CustomPrs.h"
 #include "XGUI_FacesPanel.h"
 #include "XGUI_Selection.h"
 #include "XGUI_SelectionActivate.h"
@@ -42,7 +41,6 @@
 #include <ModuleBase_BRepOwner.h>
 #include <ModuleBase_IModule.h>
 #include <ModuleBase_Preferences.h>
-#include <ModuleBase_ResultPrs.h>
 #include <ModuleBase_Tools.h>
 #include <ModuleBase_ViewerPrs.h>
 #include <ModuleBase_IViewer.h>
@@ -125,7 +123,6 @@ XGUI_Displayer::XGUI_Displayer(XGUI_Workshop* theWorkshop)
 : myWorkshop(theWorkshop), myNeedUpdate(false),
   myViewerBlockedRecursiveCount(0), myIsFirstAISContextUse(true)
 {
-  myCustomPrs = std::shared_ptr<GeomAPI_ICustomPrs>(new XGUI_CustomPrs(theWorkshop));
 }
 
 //**************************************************************
@@ -157,25 +154,10 @@ bool XGUI_Displayer::display(ObjectPtr theObject, bool theUpdateViewer)
       }
       anAIS = aPrs->getAISObject(anAIS);
     } else {
-      Handle(AIS_InteractiveObject) anAISPrs =
-        myWorkshop->module()->createPresentation(theObject);
-      if (anAISPrs.IsNull()) {
-        ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
-        if (aResult.get() != NULL) {
-          std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
-          if (aShapePtr.get() != NULL) {
-             anAISPrs = new ModuleBase_ResultPrs(aResult);
-          }
-        }
-      }
-      Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(anAISPrs);
-      if (!aShapePrs.IsNull())
-        ModuleBase_Tools::setPointBallHighlighting((AIS_Shape*)aShapePrs.get());
-      anAIS = AISObjectPtr(new GeomAPI_AISObject());
-      anAIS->setImpl(new Handle(AIS_InteractiveObject)(anAISPrs));
+      anAIS = myWorkshop->module()->createPresentation(theObject);
       isShading = true;
     }
-    if (anAIS)
+    if (anAIS.get())
       aDisplayed = display(theObject, anAIS, isShading, theUpdateViewer);
   }
   return aDisplayed;
@@ -215,7 +197,7 @@ bool XGUI_Displayer::display(ObjectPtr theObject, AISObjectPtr theAIS,
   if (!anAISIO.IsNull()) {
     appendResultObject(theObject, theAIS);
 
-    bool isCustomized = customizeObject(theObject);
+    //bool isCustomized = customizeObject(theObject);
 
     int aDispMode = isShading? Shading : Wireframe;
     if (isShading)
@@ -278,11 +260,15 @@ bool XGUI_Displayer::erase(ObjectPtr theObject, const bool theUpdateViewer)
 bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
 {
   bool aRedisplayed = false;
+  Handle(AIS_InteractiveContext) aContext = AISContext();
+  if (aContext.IsNull())
+    return aRedisplayed;
+
   if (!isVisible(theObject))
     return aRedisplayed;
 
   AISObjectPtr aAISObj = getAISObject(theObject);
-  Handle(AIS_InteractiveObject) aAISIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
+  Handle(AIS_InteractiveObject) aAISIO;
 
   GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
   if (aPrs) {
@@ -302,9 +288,11 @@ bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
     }
     aAISIO = aAIS_Obj->impl<Handle(AIS_InteractiveObject)>();
   }
+  else {
+    aAISIO = aAISObj->impl<Handle(AIS_InteractiveObject)>();
+  }
 
-  Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (!aContext.IsNull() && !aAISIO.IsNull()) {
+  if (!aAISIO.IsNull()) {
     // Check that the visualized shape is the same and the redisplay is not necessary
     // Redisplay of AIS object leads to this object selection compute and the selection
     // in the browser is lost
@@ -312,54 +300,56 @@ bool XGUI_Displayer::redisplay(ObjectPtr theObject, bool theUpdateViewer)
     // before and after the values modification.
     // Moreother, this check avoids customize and redisplay presentation if the presentable
     // parameter is changed.
-    bool isEqualShapes = false;
-    ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
-    if (aResult.get() != NULL) {
-      Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aAISIO);
-      if (!aShapePrs.IsNull()) {
-        std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
-        if (aShapePtr.get()) {
-          const TopoDS_Shape& aOldShape = aShapePrs->Shape();
-          if (!aOldShape.IsNull())
-            isEqualShapes = aOldShape.IsEqual(aShapePtr->impl<TopoDS_Shape>());
-        }
-      }
-    }
+    //bool isEqualShapes = false;
+    //ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+    //if (aResult.get() != NULL) {
+    //  Handle(AIS_Shape) aShapePrs = Handle(AIS_Shape)::DownCast(aAISIO);
+    //  if (!aShapePrs.IsNull()) {
+    //    std::shared_ptr<GeomAPI_Shape> aShapePtr = ModelAPI_Tools::shape(aResult);
+    //    if (aShapePtr.get()) {
+    //      const TopoDS_Shape& aOldShape = aShapePrs->Shape();
+    //      if (!aOldShape.IsNull())
+    //        isEqualShapes = aOldShape.IsEqual(aShapePtr->impl<TopoDS_Shape>());
+    //    }
+    //  }
+    //}
     // Customization of presentation
-    bool isCustomized = customizeObject(theObject);
+    //bool isCustomized = customizeObject(theObject);
     #ifdef DEBUG_FEATURE_REDISPLAY
-      qDebug(QString("Redisplay: %1, isEqualShapes=%2, isCustomized=%3").
-        arg(!isEqualShapes || isCustomized).arg(isEqualShapes)
-        .arg(isCustomized).toStdString().c_str());
+      qDebug(QString("Redisplay: %1, isEqualShapes=%2").
+        arg(!isEqualShapes/* || isCustomized*/).arg(isEqualShapes)
+        .toStdString().c_str());
     #endif
-    if (!isEqualShapes || isCustomized) {
-      /// if shapes are equal and presentation are customized, selection should be restored
-      bool aNeedToRestoreSelection = isEqualShapes && isCustomized;
-      if (aNeedToRestoreSelection)
-        myWorkshop->module()->storeSelection();
+    //if (!isEqualShapes/* || isCustomized*/) {
+    //  /// if shapes are equal and presentation are customized, selection should be restored
+    //  bool aNeedToRestoreSelection = isEqualShapes/* && isCustomized*/;
+    //  if (aNeedToRestoreSelection)
+      if (aAISObj.get() && myWorkshop->facesPanel())
+        myWorkshop->facesPanel()->customizeObject(theObject, aAISObj);
+
+    myWorkshop->module()->storeSelection();
 
 #ifdef CLEAR_OUTDATED_SELECTION_BEFORE_REDISPLAY
-      myWorkshop->selector()->deselectPresentation(aAISIO);
+    myWorkshop->selector()->deselectPresentation(aAISIO);
 #endif
-      if (aContext->IsDisplayed(aAISIO))
-        aContext->Redisplay(aAISIO, false);
-      else
-        aContext->Display(aAISIO, false);
-
+    if (aContext->IsDisplayed(aAISIO))
+      aContext->Redisplay(aAISIO, false);
+    else {
+      aContext->Display(aAISIO, false);
+    }
       #ifdef TINSPECTOR
       if (getCallBack()) getCallBack()->Redisplay(aAISIO);
       #endif
 
-      if (aNeedToRestoreSelection)
-        myWorkshop->module()->restoreSelection();
+      //if (aNeedToRestoreSelection)
+    myWorkshop->module()->restoreSelection();
 
-      aRedisplayed = true;
-      #ifdef DEBUG_FEATURE_REDISPLAY
-        qDebug("  Redisplay happens");
-      #endif
-      if (theUpdateViewer)
-        updateViewer();
-    }
+    aRedisplayed = true;
+    #ifdef DEBUG_FEATURE_REDISPLAY
+      qDebug("  Redisplay happens");
+    #endif
+    if (theUpdateViewer)
+      updateViewer();
   }
   return aRedisplayed;
 }
@@ -886,37 +876,37 @@ bool XGUI_Displayer::canBeShaded(ObjectPtr theObject) const
 }
 
 //**************************************************************
-bool XGUI_Displayer::customizeObject(ObjectPtr theObject)
-{
-  AISObjectPtr anAISObj = getAISObject(theObject);
-  // correct the result's color it it has the attribute
-  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
-
-  // Customization of presentation
-  GeomCustomPrsPtr aCustomPrs;
-  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
-  if (aFeature.get() != NULL) {
-    GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast<GeomAPI_ICustomPrs>(aFeature);
-    if (aCustPrs.get() != NULL)
-      aCustomPrs = aCustPrs;
-  }
-  if (aCustomPrs.get() == NULL) {
-    GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
-    // we ignore presentable not customized objects
-    if (aPrs.get() == NULL)
-      aCustomPrs = myCustomPrs;
-  }
-  bool isCustomized = aCustomPrs.get() &&
-                      aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs);
-  isCustomized = myWorkshop->module()->afterCustomisePresentation(aResult, anAISObj, myCustomPrs)
-                 || isCustomized;
-
-  // update presentation state if faces panel is active
-  if (anAISObj.get() && myWorkshop->facesPanel())
-    isCustomized = myWorkshop->facesPanel()->customizeObject(theObject, anAISObj) || isCustomized;
-
-  return isCustomized;
-}
+//bool XGUI_Displayer::customizeObject(ObjectPtr theObject)
+//{
+//  AISObjectPtr anAISObj = getAISObject(theObject);
+//  // correct the result's color it it has the attribute
+//  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+//
+//  // Customization of presentation
+//  GeomCustomPrsPtr aCustomPrs;
+//  FeaturePtr aFeature = ModelAPI_Feature::feature(theObject);
+//  if (aFeature.get() != NULL) {
+//    GeomCustomPrsPtr aCustPrs = std::dynamic_pointer_cast<GeomAPI_ICustomPrs>(aFeature);
+//    if (aCustPrs.get() != NULL)
+//      aCustomPrs = aCustPrs;
+//  }
+//  if (aCustomPrs.get() == NULL) {
+//    GeomPresentablePtr aPrs = std::dynamic_pointer_cast<GeomAPI_IPresentable>(theObject);
+//    // we ignore presentable not customized objects
+//    if (aPrs.get() == NULL)
+//      aCustomPrs = myCustomPrs;
+//  }
+//  bool isCustomized = aCustomPrs.get() &&
+//                      aCustomPrs->customisePresentation(aResult, anAISObj, myCustomPrs);
+//  isCustomized = myWorkshop->module()->afterCustomisePresentation(aResult, anAISObj, myCustomPrs)
+//                 || isCustomized;
+//
+//  // update presentation state if faces panel is active
+//  if (anAISObj.get() && myWorkshop->facesPanel())
+//    isCustomized = myWorkshop->facesPanel()->customizeObject(theObject, anAISObj) || isCustomized;
+//
+//  return isCustomized;
+//}
 
 //**************************************************************
 QColor XGUI_Displayer::setObjectColor(ObjectPtr theObject,
index 45ea2eecbc7ba1f6dcafc3a6055b9537f84bca61..b9d13642c220e6f43cca2977a50516589df4164b 100644 (file)
@@ -23,7 +23,6 @@
 #include "XGUI.h"
 
 #include <GeomAPI_AISObject.h>
-#include <GeomAPI_ICustomPrs.h>
 #include <GeomAPI_Pln.h>
 
 #include <ModelAPI_Result.h>
@@ -453,10 +452,6 @@ private:
 #endif
   Handle(SelectMgr_AndFilter) myAndFilter; ///< A container for selection filters
 
-  /// A default custom presentation, which is used if the displayed feature is not
-  /// a custom presentation
-  GeomCustomPrsPtr myCustomPrs;
-
   /// Definition of a type of map which defines correspondance between objects and presentations
 #ifdef OPTIMIZE_PRS
   XGUI_TwoSidePresentationMap myResult2AISObjectMap; ///< A map of displayed objects
index f97e58aa6254e88dbb5d7538b812a2ee41cc5775..678e112fbd68ab17679b2140b19052405dcc509d 100644 (file)
@@ -45,7 +45,6 @@
 #include "XGUI_Tools.h"
 #include "XGUI_ViewerProxy.h"
 #include "XGUI_WorkshopListener.h"
-#include <XGUI_CustomPrs.h>
 #include <XGUI_HistoryMenu.h>
 #include <XGUI_QtEvents.h>
 #include <XGUI_DataModel.h>
@@ -274,22 +273,6 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
   connect(myEventsListener, SIGNAL(errorOccurred(std::shared_ptr<Events_InfoMessage>)),
           myErrorDlg, SLOT(addError(std::shared_ptr<Events_InfoMessage>)));
 
-  //Config_PropManager::registerProp("Visualization", "object_default_color", "Object color",
-  //                                 Config_Prop::Color, "225,225,225");
-
-  Config_PropManager::registerProp("Visualization", "result_body_color", "Result color",
-                                   Config_Prop::Color, ModelAPI_ResultBody::DEFAULT_COLOR());
-  Config_PropManager::registerProp("Visualization", "result_group_color", "Group color",
-                                   Config_Prop::Color, ModelAPI_ResultGroup::DEFAULT_COLOR());
-  Config_PropManager::registerProp("Visualization", "result_construction_color",
-                                   "Construction color",
-                                   Config_Prop::Color,
-                                   ModelAPI_ResultConstruction::DEFAULT_COLOR());
-  Config_PropManager::registerProp("Visualization", "result_part_color", "Part color",
-                                   Config_Prop::Color, ModelAPI_ResultPart::DEFAULT_COLOR());
-  Config_PropManager::registerProp("Visualization", "result_field_color", "Field color",
-                                   Config_Prop::Color, ModelAPI_ResultField::DEFAULT_COLOR());
-
   if (ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "face-selection", true))
     myViewerSelMode.append(TopAbs_FACE);
   if (ModuleBase_Preferences::resourceMgr()->booleanValue("Viewer", "edge-selection", true))
@@ -2296,7 +2279,7 @@ void XGUI_Workshop::changeColor(const QObjectPtrList& theObjects)
   foreach(ObjectPtr anObject, theObjects) {
     ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
     if (aResult.get()) {
-      XGUI_CustomPrs::getResultColor(aResult, aColor);
+      ModelAPI_Tools::getColor(aResult, aColor);
     }
     else {
       // TODO: remove the obtaining a color from the AIS object
@@ -2409,7 +2392,7 @@ void XGUI_Workshop::changeDeflection(const QObjectPtrList& theObjects)
   foreach(ObjectPtr anObject, theObjects) {
     ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
     if (aResult.get()) {
-      aDeflection = XGUI_CustomPrs::getResultDeflection(aResult);
+      aDeflection = ModelAPI_Tools::getDeflection(aResult);
     }
     else {
       // TODO: remove the obtaining a property from the AIS object
@@ -2472,7 +2455,7 @@ void XGUI_Workshop::changeTransparency(const QObjectPtrList& theObjects)
   foreach(ObjectPtr anObject, theObjects) {
     ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(anObject);
     if (aResult.get()) {
-      aCurrentValue = XGUI_CustomPrs::getResultTransparency(aResult);
+      aCurrentValue = ModelAPI_Tools::getTransparency(aResult);
     }
     if (aCurrentValue > 0)
       break;
index e420a5aec4814eb9666bf2eb4eb07e7780967bf5..6ec62aba90d20ed11338b7a168406cf857fea6d3 100644 (file)
@@ -103,6 +103,7 @@ void XGUI_WorkshopListener::initializeEventListening()
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED));
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+  aLoop->registerListener(this, Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES));
   aLoop->registerListener(this, Events_LongOp::eventID());
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED));
 
@@ -149,8 +150,32 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr<Events_Message>&
   // Redisplay feature
   else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) {
     std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
-        std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+      std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
     onFeatureRedisplayMsg(aUpdMsg);
+  }
+  else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_VISUAL_ATTRIBUTES)) {
+    std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
+      std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+    std::set<ObjectPtr> aObjList = aUpdMsg->objects();
+    std::set<ObjectPtr>::const_iterator aIt;
+    std::list<ResultPtr>::const_iterator aResIt;
+    XGUI_Displayer* aDisplayer = workshop()->displayer();
+    AISObjectPtr aAIS;
+    for (aIt = aObjList.begin(); aIt != aObjList.end(); ++aIt) {
+      FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(*aIt);
+      if (aFeature) {
+        aAIS = aDisplayer->getAISObject(aFeature);
+        if (aAIS.get())
+          workshop()->module()->customizePresentation(aFeature, aAIS);
+
+        std::list<ResultPtr> aResults = aFeature->results();
+        for (aResIt = aResults.begin(); aResIt != aResults.end(); ++aResIt) {
+          aAIS = aDisplayer->getAISObject(*aResIt);
+          if (aAIS.get())
+            workshop()->module()->customizePresentation(*aResIt, aAIS);
+        }
+      }
+    }
   } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)) {
     std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
         std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
@@ -354,7 +379,7 @@ void XGUI_WorkshopListener::
   //if (aHiddenObjects.size() > 0)
   //  myWorkshop->module()->processHiddenObject(aHiddenObjects);
 
-  bool isCustomized = customizeCurrentObject(anObjects, aRedisplayed);
+  bool isCustomized = customizeFeature(anObjects, aRedisplayed);
   if (aRedisplayed || isCustomized) {
     Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION));
 
@@ -423,7 +448,7 @@ void XGUI_WorkshopListener::
     }
   }
 
-  bool isCustomized = customizeCurrentObject(anObjects, aDisplayed);
+  bool isCustomized = customizeFeature(anObjects, aDisplayed);
 
   //if (myObjectBrowser)
   //  myObjectBrowser->processEvent(theMsg);
@@ -501,7 +526,7 @@ bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj)
   return aDisplayer->display(theObj, false);
 }
 
-bool XGUI_WorkshopListener::customizeCurrentObject(const std::set<ObjectPtr>& theObjects,
+bool XGUI_WorkshopListener::customizeFeature(const std::set<ObjectPtr>& theObjects,
                                                    bool theForceRedisplay)
 {
   XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr();
@@ -521,11 +546,11 @@ bool XGUI_WorkshopListener::customizeCurrentObject(const std::set<ObjectPtr>& th
     // the feature is hidden, but arguments of the feature are modified
     // e.g. extrusion is hidden(h=0) but sketch is chosen
     if (theForceRedisplay || theObjects.find(aCurrentFeature) != theObjects.end()) {
-      aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature,
+      aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature,
                                  ModuleBase_IModule::CustomizeArguments, false) || aCustomized;
-      aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature,
+      aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature,
                                    ModuleBase_IModule::CustomizeResults, false) || aCustomized;
-      aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature,
+      aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature,
                         ModuleBase_IModule::CustomizeHighlightedObjects, false) || aCustomized;
     }
   }
index f6ab5a6ef8f312622b9c918756cb2551cf59aa32..e2d548c461b34c71b38f90d7d37cd05044f7dc11 100644 (file)
@@ -97,7 +97,7 @@ protected:
   ///                   if forced redisplay is false
   /// \param theForceRedisplay a flag to customize object even always
   /// \return true if the object is modified
-  bool customizeCurrentObject(const std::set<ObjectPtr>& theObjects, bool theForceRedisplay);
+  bool customizeFeature(const std::set<ObjectPtr>& theObjects, bool theForceRedisplay);
 
   /// Returns the workshop
   XGUI_Workshop* workshop() const;
diff --git a/src/XGUI/XGUI_msg_fr.ts b/src/XGUI/XGUI_msg_fr.ts
new file mode 100644 (file)
index 0000000..bb79b9e
--- /dev/null
@@ -0,0 +1,855 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="XGUI_Tools.cpp" line="154"/>
+        <source>Warning</source>
+        <translation>Attention</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Tools.cpp" line="213"/>
+        <source>Name %2 already exists in %1.</source>
+        <translation>Le nom %2 existe déjà dans %1.</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="170"/>
+        <source>Move to the end</source>
+        <translation>Aller à la fin</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="177"/>
+        <source>SHAPER files (*.shaper *.cadbld)</source>
+        <translation>Fichiers SHAPER (*.shaper *.cadbld)</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="178"/>
+        <source>SHAPER files (*.shaper)</source>
+        <translation>Fichiers SHAPER (*.shaper)</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="181"/>
+        <source>CAD Builder files (*.cadbld);;All files (*.*)</source>
+        <translation>Fichiers CAD Builder (*.cadbld);;Tous les fichiers (*. *)</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="182"/>
+        <source>CAD Builder files (*.cadbld)</source>
+        <translation>Fichiers CAD Builder (*.cadbld)</translation>
+    </message>
+    <message>
+        <location filename="XGUI_OperationMgr.cpp" line="893"/>
+        <source>Abort operation</source>
+        <translation>Abandonner l&apos;opération</translation>
+    </message>
+    <message>
+        <location filename="XGUI_OperationMgr.cpp" line="904"/>
+        <source>Validate operation</source>
+        <translation>Valider l&apos;opération</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_ActionsMgr</name>
+    <message>
+        <location filename="XGUI_ActionsMgr.cpp" line="194"/>
+        <source>Shortcut %1 is already defined. Ignore.</source>
+        <translation>Le raccourci %1 est déjà défini. Ignorer.</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ActionsMgr.cpp" line="254"/>
+        <source>Apply</source>
+        <translation>Appliquer</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ActionsMgr.cpp" line="259"/>
+        <source>Apply and continue</source>
+        <translation>Appliquer et continuer</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ActionsMgr.cpp" line="264"/>
+        <source>Cancel</source>
+        <translation>Annuler</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ActionsMgr.cpp" line="269"/>
+        <source>Help</source>
+        <translation>Aide</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ActionsMgr.cpp" line="274"/>
+        <source>See preview</source>
+        <translation>Voir l&apos;aperçu</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ActionsMgr.cpp" line="275"/>
+        <source>Compute preview</source>
+        <translation>Calculer l&apos;aperçu avant impression</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_ColorDialog</name>
+    <message>
+        <location filename="XGUI_ColorDialog.cpp" line="35"/>
+        <source>Color</source>
+        <translation>Couleur</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ColorDialog.cpp" line="53"/>
+        <source>Random</source>
+        <translation>Aléatoire</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_ContextMenuMgr</name>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="88"/>
+        <source>Delete</source>
+        <translation>Effacer</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="95"/>
+        <source>Rename</source>
+        <translation>Renommer</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="104"/>
+        <source>Clean history</source>
+        <translation>Vider l’historique</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="107"/>
+        <source>Color...</source>
+        <translation>Couleur...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="110"/>
+        <source>Deflection...</source>
+        <translation>Déviation...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="114"/>
+        <source>Transparency...</source>
+        <translation>Transparence...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="117"/>
+        <source>Show</source>
+        <translation>Afficher</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="120"/>
+        <source>Show only</source>
+        <translation>Montrer seulement</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="124"/>
+        <source>Hide</source>
+        <translation>Cacher</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="128"/>
+        <source>Hide all</source>
+        <translation>Cacher tout</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="132"/>
+        <source>Shading</source>
+        <translation>Ombrage</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="135"/>
+        <source>Wireframe</source>
+        <translation>Fil de fer</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="148"/>
+        <source>Vertices</source>
+        <translation>Sommets</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="153"/>
+        <source>Edges</source>
+        <translation>Arêtes</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="158"/>
+        <source>Faces</source>
+        <translation>Faces</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="163"/>
+        <source>Results</source>
+        <translation>Résultats</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="171"/>
+        <source>Select results</source>
+        <translation>Sélectionnez les résultats</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="175"/>
+        <source>Select parent feature</source>
+        <translation>Sélectionner une entité parente</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="179"/>
+        <source>TInspector</source>
+        <translation>TInspector</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="185"/>
+        <source>Insert a folder before</source>
+        <translation>Insérer un dossier avant</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="189"/>
+        <source>Move into the previous folder</source>
+        <translation>Déplacer dans le dossier précédent</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="193"/>
+        <source>Move into the next folder</source>
+        <translation>Se déplacer dans le dossier suivant</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="197"/>
+        <source>Move out before the folder</source>
+        <translation>Sortir avant le dossier</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="201"/>
+        <source>Move out after the folder</source>
+        <translation>Sortir après le dossier</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="205"/>
+        <source>Set view by inverted normal to face</source>
+        <translation>Définir la vue par normale inversée à la face</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="209"/>
+        <source>Set view by normal to face</source>
+        <translation>Définir la vue par la normale à la face</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="806"/>
+        <source>Selection mode</source>
+        <translation>Mode de sélection</translation>
+    </message>
+    <message>
+        <location filename="XGUI_ContextMenuMgr.cpp" line="859"/>
+        <source>Windows</source>
+        <translation>Fenêtres</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_DataTree</name>
+    <message>
+        <location filename="XGUI_ObjectsBrowser.cpp" line="203"/>
+        <source>History change</source>
+        <translation>Changement l&apos;historique</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_DeflectionDialog</name>
+    <message>
+        <location filename="XGUI_DeflectionDialog.cpp" line="35"/>
+        <source>Deflection</source>
+        <translation>Déviation</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_ErrorDialog</name>
+    <message>
+        <location filename="XGUI_ErrorDialog.cpp" line="37"/>
+        <source>Application errors</source>
+        <translation>Erreurs d&apos;application</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_ErrorMgr</name>
+    <message>
+        <location filename="XGUI_ErrorMgr.cpp" line="204"/>
+        <location filename="XGUI_ErrorMgr.cpp" line="209"/>
+        <source>Errors:</source>
+        <translation>Erreurs:</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_FacesPanel</name>
+    <message>
+        <location filename="XGUI_FacesPanel.cpp" line="54"/>
+        <source>Hide Faces</source>
+        <translation>Masquer les faces</translation>
+    </message>
+    <message>
+        <location filename="XGUI_FacesPanel.cpp" line="63"/>
+        <source>Transparent</source>
+        <translation>Transparent</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_InspectionPanel</name>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="115"/>
+        <source>Inspection Panel</source>
+        <translation>Panneau d&apos;inspection</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="125"/>
+        <source>Object</source>
+        <translation>Objet</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="137"/>
+        <source>Sub-shapes</source>
+        <translation>Sous-formes</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="137"/>
+        <source>Number</source>
+        <translation>Nombre</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="141"/>
+        <source>SHAPE</source>
+        <translation>FORME</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="141"/>
+        <source>COMPOUND</source>
+        <translation>ASSEMBLAGE</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="141"/>
+        <source>COMPSOLID</source>
+        <translation>COMPSOLIDE</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="142"/>
+        <source>SOLID</source>
+        <translation>SOLIDE</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="142"/>
+        <source>SHELL</source>
+        <translation>COQUE</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="142"/>
+        <source>FACE</source>
+        <translation>FACE</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="142"/>
+        <source>WIRE</source>
+        <translation>CONTOUR</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="142"/>
+        <source>EDGE</source>
+        <translation>BORD</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="142"/>
+        <source>VERTEX</source>
+        <translation>SOMMET</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="165"/>
+        <source>Type:</source>
+        <translation>Type:</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="340"/>
+        <source>Vertex</source>
+        <translation>Sommet</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="343"/>
+        <source>Coordinates</source>
+        <translation>Coordonnées</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="352"/>
+        <source>Degenerated</source>
+        <translation>Dégénéré</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="359"/>
+        <source>Line segment</source>
+        <translation>Segment de ligne</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="371"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="385"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="624"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="662"/>
+        <source>Center</source>
+        <translation>Centre</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="372"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="386"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="458"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="615"/>
+        <source>Normal</source>
+        <translation>Normale</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="373"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="387"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="459"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="625"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="637"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="650"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="664"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="676"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="692"/>
+        <source>Dimensions</source>
+        <translation>Dimensions</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="374"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="626"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="638"/>
+        <source>Radius</source>
+        <translation>Rayon</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="388"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="665"/>
+        <source>Major radius</source>
+        <translation>Rayon majeur</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="389"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="666"/>
+        <source>Minor radius</source>
+        <translation>Rayon mineur</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="393"/>
+        <source>Edge</source>
+        <translation>Bord</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="398"/>
+        <source>Start point</source>
+        <translation>Point de départ</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="399"/>
+        <source>End point</source>
+        <translation>Point final</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="408"/>
+        <source>Closed</source>
+        <translation>Fermé</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="413"/>
+        <source>Polygon</source>
+        <translation>Polygone</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="417"/>
+        <source>Point</source>
+        <translation>Point</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="421"/>
+        <source>Wire</source>
+        <translation>Contour</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="456"/>
+        <source>Rectangle</source>
+        <translation>Rectangle</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="457"/>
+        <source>Corner</source>
+        <translation>Coin</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="460"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="677"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="693"/>
+        <source>Width</source>
+        <translation>Largeur</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="461"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="639"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="653"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="679"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="695"/>
+        <source>Height</source>
+        <translation>Hauteur</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="470"/>
+        <source>Plane</source>
+        <translation>Plan</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="476"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="507"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="547"/>
+        <source>Sphere</source>
+        <translation>Sphère</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="481"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="512"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="552"/>
+        <source>Cylinder</source>
+        <translation>Cylindre</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="486"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="517"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="557"/>
+        <source>Cone</source>
+        <translation>Cône</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="491"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="522"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="562"/>
+        <source>Torus</source>
+        <translation>Tore</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="494"/>
+        <source>Face</source>
+        <translation>Face</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="528"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="568"/>
+        <source>Box</source>
+        <translation>Boîte</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="530"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="570"/>
+        <source>Rotated Box</source>
+        <translation>Boîte tournée</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="534"/>
+        <source>Shell</source>
+        <translation>Coque</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="574"/>
+        <source>Solid</source>
+        <translation>Solide</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="604"/>
+        <source>Bounding box</source>
+        <translation>Boîte englobante</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="605"/>
+        <source>Minimal corner</source>
+        <translation>Coin minimal</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="606"/>
+        <source>Maximal corner</source>
+        <translation>Coin maximal</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="614"/>
+        <source>Origin</source>
+        <translation>Origine</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="635"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="648"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="675"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="689"/>
+        <source>Position</source>
+        <translation>Position</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="636"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="649"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="663"/>
+        <source>Axis</source>
+        <translation>Axe</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="651"/>
+        <source>Radius 1</source>
+        <translation>Rayon 1</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="652"/>
+        <source>Radius 2</source>
+        <translation>Rayon 2</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="678"/>
+        <location filename="XGUI_InspectionPanel.cpp" line="694"/>
+        <source>Depth</source>
+        <translation>Profondeur</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="690"/>
+        <source>Z axis</source>
+        <translation>Axe Z</translation>
+    </message>
+    <message>
+        <location filename="XGUI_InspectionPanel.cpp" line="691"/>
+        <source>X axis</source>
+        <translation>Axe X</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_ObjectsBrowser</name>
+    <message>
+        <location filename="XGUI_ObjectsBrowser.cpp" line="396"/>
+        <source>Part set</source>
+        <translation>Ensemble</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_OperationMgr</name>
+    <message>
+        <location filename="XGUI_OperationMgr.cpp" line="254"/>
+        <source>All active operations will be aborted.</source>
+        <translation>Toutes les opérations actives seront annulées.</translation>
+    </message>
+    <message>
+        <location filename="XGUI_OperationMgr.cpp" line="259"/>
+        <source>Please validate all your active operations before saving.</source>
+        <translation>Veuillez valider toutes vos opérations actives avant de sauvegarder.</translation>
+    </message>
+    <message>
+        <location filename="XGUI_OperationMgr.cpp" line="341"/>
+        <source>%1 operation will be aborted.</source>
+        <translation>%1 opération sera abandonnée.</translation>
+    </message>
+    <message>
+        <location filename="XGUI_OperationMgr.cpp" line="348"/>
+        <source>Please validate your %1 before saving.</source>
+        <translation>Veuillez valider votre %1 avant de sauvegarder.</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_PropertyPanel</name>
+    <message>
+        <location filename="XGUI_PropertyPanel.cpp" line="73"/>
+        <location filename="XGUI_PropertyPanel.cpp" line="167"/>
+        <source>Property Panel</source>
+        <translation>Panneau de propriété</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_TransparencyWidget</name>
+    <message>
+        <location filename="XGUI_TransparencyWidget.cpp" line="39"/>
+        <source>Opaque</source>
+        <translation>Opaque</translation>
+    </message>
+    <message>
+        <location filename="XGUI_TransparencyWidget.cpp" line="45"/>
+        <source>Transparent</source>
+        <translation>Transparent</translation>
+    </message>
+</context>
+<context>
+    <name>XGUI_Workshop</name>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="427"/>
+        <location filename="XGUI_Workshop.cpp" line="489"/>
+        <source>Undo</source>
+        <translation>Annuler</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="428"/>
+        <location filename="XGUI_Workshop.cpp" line="489"/>
+        <source>Undo last command</source>
+        <translation>Annuler la dernière commande</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="438"/>
+        <location filename="XGUI_Workshop.cpp" line="498"/>
+        <source>Redo</source>
+        <translation>Refaire</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="438"/>
+        <location filename="XGUI_Workshop.cpp" line="498"/>
+        <source>Redo last command</source>
+        <translation>Refaire la dernière commande</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="460"/>
+        <source>Export native...</source>
+        <translation>Exporter natif...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="461"/>
+        <source>Export the current document into a native file</source>
+        <translation>Exporter le document actuel dans un fichier natif</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="466"/>
+        <source>Import native...</source>
+        <translation>Importer natif...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="467"/>
+        <source>Import native file</source>
+        <translation>Importer un fichier natif</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="479"/>
+        <source>Save</source>
+        <translation>Enregistrer</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="479"/>
+        <source>Save the document</source>
+        <translation>Enregistrer le document</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="484"/>
+        <source>Save as...</source>
+        <translation>Enregistrer sous...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="484"/>
+        <source>Save the document into a file</source>
+        <translation>Enregistrer le document dans un fichier</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="506"/>
+        <source>Open...</source>
+        <translation>Ouvrir...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="506"/>
+        <source>Open a new document</source>
+        <translation>Ouvrir un nouveau document</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="511"/>
+        <source>Auto rebuild</source>
+        <translation>Reconstruction automatique</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="512"/>
+        <source>Blocks immediate apply of modifications</source>
+        <translation>Bloque l&apos;application immédiate des modifications</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="517"/>
+        <source>Preferences</source>
+        <translation>Préférences</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="517"/>
+        <source>Edit preferences</source>
+        <translation>Modifier les préférences</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="521"/>
+        <source>Exit</source>
+        <translation>Quitter</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="521"/>
+        <source>Exit application</source>
+        <translation>Quitter l’application</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="931"/>
+        <location filename="XGUI_Workshop.cpp" line="1034"/>
+        <source>Save current file</source>
+        <translation>Enregistrer le fichier courant</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="932"/>
+        <source>The document is modified, save before opening another?</source>
+        <translation>Le document est modifié, sauvegarder avant d&apos;en ouvrir un autre ?</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="946"/>
+        <source>Open file</source>
+        <translation>Fichier ouvert</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="1117"/>
+        <source>Select name to save file...</source>
+        <translation>Sélectionnez le nom pour enregistrer le fichier...</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="1782"/>
+        <source>Show object</source>
+        <translation>Montrer l&apos;objet</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="1783"/>
+        <source>&apos;%1&apos;
+ are hidden by %2:
+Remove objects from the panel to be displayed?</source>
+        <translation>&apos;%1&apos;
+ est caché par %2 :
+Supprimer des objets du panneau à afficher ?</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="961"/>
+        <source>Warning</source>
+        <translation>Attention</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="961"/>
+        <source>Unable to open the file.</source>
+        <translation>Impossible d&apos;ouvrir le fichier.</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="1034"/>
+        <source>The document is modified, save before exit?</source>
+        <translation>Le document est modifié, enregistrer avant de quitter ?</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="1251"/>
+        <source>Information about module &quot;%1&quot; doesn&apos;t exist.</source>
+        <translation>Les informations sur le module &quot;%1&quot; n&apos;existent pas.</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="1412"/>
+        <source>Object browser</source>
+        <translation>Navigateur d&apos;objet</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="2031"/>
+        <source>All features are relevant, there is nothing to be deleted</source>
+        <translation>Toutes les fonctionnalités sont pertinentes, il n&apos;y a rien à supprimer</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="2486"/>
+        <source>Transparency</source>
+        <translation>Transparence</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="2866"/>
+        <source>Find results</source>
+        <translation>Trouver des résultats</translation>
+    </message>
+    <message>
+        <location filename="XGUI_Workshop.cpp" line="2867"/>
+        <source>Results not found</source>
+        <translation>Résultats non trouvés</translation>
+    </message>
+</context>
+</TS>