# 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)
: 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);
}
}
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
{
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;
}
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
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_
#include <ModelAPI_AttributeSelectionList.h>
#include <ModelAPI_ResultBody.h>
+#include <ModelAPI_ResultConstruction.h>
#include <GeomAPI_Edge.h>
#include <GeomAPI_PlanarEdges.h>
if(!aShape.get()) {
aShape = aContext;
}
- // keep selected faces "as is"
if (aShape->shapeType() == GeomAPI_Shape::FACE) {
+ // keep selected faces "as is"
anOriginalFaces.push_back(aShape);
continue;
}
+ else if (!aSelection->value() && aShape->shapeType() == GeomAPI_Shape::COMPOUND) {
+ // collect faces from the sketch
+ ResultConstructionPtr aSketch =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aSelection->context());
+ if (aSketch && aSketch->facesNum() > 0) {
+ for (int i = 0; i < aSketch->facesNum(); ++i)
+ anOriginalFaces.push_back(aSketch->face(i));
+ continue;
+ }
+ }
for(GeomAPI_ShapeExplorer anExp(aShape, GeomAPI_Shape::EDGE); anExp.more(); anExp.next()) {
GeomShapePtr anEdge = anExp.current();
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);
ListOfShape aShapes, aContexts;
getOriginalShapesAndContexts(BASE_OBJECTS_ID(), aShapes, aContexts);
+ // Collect sketch faces.
+ for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
+ AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
+ GeomShapePtr aShape = aSelection->value();
+ ResultConstructionPtr aContext =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aSelection->context());
+ if (!aShape && aContext) {
+ for (int i = 0; i < aContext->facesNum(); ++i)
+ aShapes.push_back(aContext->face(i));
+ }
+ }
+
// Sew faces.
GeomMakeShapePtr aSewingAlgo(new GeomAlgoAPI_Sewing(aShapes));
#include <GeomValidators_FeatureKind.h>
#include <GeomValidators_ShapeType.h>
+#include <SketchPlugin_Sketch.h>
+
#include <Events_InfoMessage.h>
//=================================================================================================
theError = "Infinite objects not acceptable.";
return false;
}
-
- std::shared_ptr<GeomAPI_PlanarEdges> anEdges =
- std::dynamic_pointer_cast<GeomAPI_PlanarEdges>(aContextShape);
- if(anEdges.get()) {
- if(aShape->isEqual(aContextShape)) {
- // It is whole sketch.
- return false;
- }
-
- continue;
- }
}
}
}
aShape = aSelection->context()->shape();
}
- if (aShape->shapeType() == GeomAPI_Shape::FACE) {
+ ResultConstructionPtr aSketchRes =
+ std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aSelection->context());
+
+ if (aShape->shapeType() == GeomAPI_Shape::FACE ||
+ (!aSelection->value() && aSketchRes && aSketchRes->facesNum() > 0)) {
// skip faces exploding
hasFaces = true;
continue;
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) {
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 aShape = aSelectionAttr->value();
+ ResultPtr aContext = aSelectionAttr->context();
+ if (!aShape.get() && aContext.get())
+ aShape = aContext->shape();
+ if (aShape.get())
+ isVertex = (aShape->shapeType() == GeomAPI_Shape::VERTEX);
+
+ if (!isVertex) {
+ // Sketch?
+ FeaturePtr aFeature = aSelectionAttr->contextFeature();
+ if (!aFeature.get()) {
+ GeomShapePtr aValue = aSelectionAttr->value();
+ // whole sketch is allowed only
+ if (aContext.get() && !aValue.get()) {
+ aFeature = ModelAPI_Feature::feature(aContext);
+ }
+ }
+
+ if (!aFeature.get()) {
+ theError = "Error: Incorrect selection.";
+ return false;
+ }
+
+ if (aFeature->getKind() != SketchPlugin_Sketch::ID()) {
+ theError = "Error: %1 shape is not allowed for selection.";
+ theError.arg(aFeature->getKind());
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
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
#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_CompoundBuilder.h>
#include <GeomAlgoAPI_Copy.h>
+#include <GeomAlgoAPI_MakeShapeList.h>
#include <GeomAlgoAPI_Tools.h>
+#include <GeomAlgoAPI_Partition.h>
+#include <GeomAlgoAPI_ShapeTools.h>
+
+#include <GeomAPI_ShapeExplorer.h>
//=================================================================================================
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());
}
-//=================================================================================================
-void BuildPlugin_Vertex::execute()
+void BuildPlugin_Vertex::buildVertices(const ListOfShape& theShapes, bool isIntersect)
{
- // Get base objects list.
- AttributeSelectionListPtr aSelectionList = selectionList(BASE_OBJECTS_ID());
- if(!aSelectionList.get()) {
- setError("Error: Could not get selection list.");
- return;
- }
- if(aSelectionList->size() == 0) {
- setError("Error: Empty selection list.");
- return;
- }
+ GeomShapePtr aResult;
+ std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo;
+ if (isIntersect) {
+ aPartitionAlgo.reset(new GeomAlgoAPI_Partition(theShapes, ListOfShape()));
- // Collect base shapes.
- ListOfShape aListOfShapes;
- int aResultIndex = 0;
- for(int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
- AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
- GeomShapePtr aShape = aSelection->value();
- if(!aShape.get()) {
- ResultPtr aContext = aSelection->context();
- if(!aContext.get()) {
- setError("Error: Attribute has empty context.");
- return;
- }
-
- aShape = aContext->shape();
- }
- if(!aShape.get()) {
- setError("Error: Empty shape selected.");
+ std::string anError;
+ if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aPartitionAlgo, getKind(), anError)) {
+ setError(anError);
return;
}
- if(aShape->shapeType() != GeomAPI_Shape::VERTEX) {
- setError("Error: Selected shape has wrong type. Only vertices acceptable.");
- return;
- }
+ aResult = aPartitionAlgo->shape();
+ }
+ else
+ aResult = GeomAlgoAPI_CompoundBuilder::compound(theShapes);
- // Copy shape.
- std::shared_ptr<GeomAlgoAPI_Copy> aCopyAlgo(new GeomAlgoAPI_Copy(aShape));
+ int aResultIndex = 0;
- std::string anError;
- if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aCopyAlgo, getKind(), anError)) {
- setError(anError);
- return;
- }
+ // Explode on vertices
+ std::set<GeomVertexPtr, GeomAPI_Vertex::GeometricComparator> aProcessed;
+ for (GeomAPI_ShapeExplorer anExp(aResult, GeomAPI_Shape::VERTEX); anExp.more(); anExp.next()) {
+ GeomVertexPtr aVertex(new GeomAPI_Vertex(anExp.current()));
+ if (aProcessed.find(aVertex) != aProcessed.end())
+ continue; // vertex is already processed
+ aProcessed.insert(aVertex);
+
+ std::shared_ptr<GeomAlgoAPI_Copy> aCopy(new GeomAlgoAPI_Copy(aVertex));
+ aVertex.reset(new GeomAPI_Vertex(aCopy->shape()));
+
+ std::shared_ptr<GeomAlgoAPI_MakeShapeList> aMakeShapeList(new GeomAlgoAPI_MakeShapeList);
+ if (aPartitionAlgo)
+ aMakeShapeList->appendAlgo(aPartitionAlgo);
+ aMakeShapeList->appendAlgo(aCopy);
// Store result.
ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
- aResultBody->storeModified(aShape, aCopyAlgo->shape());
+ aResultBody->storeModified(theShapes, aVertex, aMakeShapeList);
setResult(aResultBody, aResultIndex);
++aResultIndex;
}
removeResults(aResultIndex);
}
+
+static void collectEdgesAndVertices(AttributeSelectionPtr theSelection, ListOfShape& thePrimitives)
+{
+ FeaturePtr aFeature = theSelection->contextFeature();
+ ResultPtr aContext = theSelection->context();
+ GeomShapePtr aShape = theSelection->value();
+ if (aShape)
+ thePrimitives.push_back(aShape);
+ else {
+ if (aContext && !aFeature)
+ aFeature = ModelAPI_Feature::feature(aContext);
+ if (!aFeature)
+ return;
+
+ // process results of the feature
+ const std::list<ResultPtr>& aResults = aFeature->results();
+ std::list<ResultPtr>::const_iterator anIt = aResults.begin();
+ for (; anIt != aResults.end(); ++anIt)
+ thePrimitives.push_back((*anIt)->shape());
+
+ CompositeFeaturePtr aComposite =
+ std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(aFeature);
+ if (!aComposite)
+ return;
+
+ // add construction points (centers of circles, etc.)
+ for (int i = 0, nbSubs = aComposite->numberOfSubs(); i < nbSubs; ++i) {
+ FeaturePtr aSubFeature = aComposite->subFeature(i);
+ const std::list<ResultPtr>& aSubResults = aSubFeature->results();
+ // find all points
+ for (anIt = aSubResults.begin(); anIt != aSubResults.cend(); ++anIt) {
+ GeomShapePtr aSubResShape = (*anIt)->shape();
+ if (aSubResShape->isVertex())
+ thePrimitives.push_back(aSubResShape);
+ }
+ }
+ }
+}
+
+void BuildPlugin_Vertex::execute()
+{
+ // Get base objects list.
+ AttributeSelectionListPtr aSelectionList = selectionList(BASE_OBJECTS_ID());
+ if (!aSelectionList.get()) {
+ setError("Error: Could not get selection list.");
+ return;
+ }
+ if (aSelectionList->size() == 0) {
+ setError("Error: Empty selection list.");
+ return;
+ }
+
+ // 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 collect shapes
+ ListOfShape aShapes;
+ for (int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
+ AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
+ collectEdgesAndVertices(aSelection, aShapes);
+ }
+
+ buildVertices(aShapes, isIntersect);
+}
#include "BuildPlugin.h"
#include <ModelAPI_Feature.h>
+#include <GeomAPI_Shape.h>
/// \class BuildPlugin_Vertex
/// \ingroup Plugins
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()
{
/// Creates a new part document if needed.
BUILDPLUGIN_EXPORT virtual void execute();
+
+protected:
+ void buildVertices(const ListOfShape& theShapes, bool isIntersect);
};
#endif
--- /dev/null
+<?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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'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'est pas à l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'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'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'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'é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'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'importe quel type d'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'arêtes d'esquisse ou d'autres objets d'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'esquisse ou d'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'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'une liste d'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'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'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'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'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><end></source>
+ <translation><fin></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><start></source>
+ <translation><début></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'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'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'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'un point d'esquisse ou d'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'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'arêtes de l’esquisse, d'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'autres segments de l'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'esquisse, d'arêtes ou de contours.</translation>
+ </message>
+ </context>
+
+</TS>
${PROJECT_SOURCE_DIR}/src/ModelAPI
${PROJECT_SOURCE_DIR}/src/GeomAPI
${PROJECT_SOURCE_DIR}/src/GeomAlgoAPI
+ ${PROJECT_SOURCE_DIR}/src/GeomDataAPI
${PROJECT_SOURCE_DIR}/src/GeomValidators
+ ${PROJECT_SOURCE_DIR}/src/SketchPlugin
)
SET(PROJECT_HEADERS
SET(TEXT_RESOURCES
BuildPlugin_msg_en.ts
+ BuildPlugin_msg_fr.ts
)
SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
ADD_UNIT_TESTS(TestVertex.py
TestVertex_ErrorMsg.py
+ TestVertex_WholeSketch_1.py
+ TestVertex_WholeSketch_2.py
TestEdge.py
TestEdge_ByPoints.py
TestEdge_ErrorMsg.py
TestInterpolation.py
TestFace.py
TestFace_ErrorMsg.py
+ TestFace_WholeSketch_1.py
+ TestFace_WholeSketch_2.py
TestShell.py
+ TestShell_WholeSketch_1.py
+ TestShell_WholeSketch_2.py
TestSolid.py
TestSolid_ErrorMsg.py
TestCompSolid.py
--- /dev/null
+# 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 GeomAPI import *
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(0, -20, 45, -15)
+SketchLine_2 = Sketch_1.addLine(45, -15, 10, 15)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(10, 15, 25, -40)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_2.addCircle(-5, 10, 20)
+SketchLine_4 = Sketch_2.addLine(-25, 10, 15, 10)
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_4.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchCircle_1.results()[1])
+model.do()
+Face_1 = model.addFace(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")])
+model.end()
+
+model.testNbResults(Face_1, 1)
+model.testNbSubShapes(Face_1, GeomAPI_Shape.FACE, [1])
+model.testNbSubShapes(Face_1, GeomAPI_Shape.EDGE, [3])
+model.testNbSubShapes(Face_1, GeomAPI_Shape.VERTEX, [6])
+model.testResultsVolumes(Face_1, [441.0539215686274])
+
+assert(model.checkPythonDump())
--- /dev/null
+# 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 GeomAPI import *
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(0, -20, 45, -15)
+SketchLine_2 = Sketch_1.addLine(45, -15, 10, 15)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(10, 15, 25, -40)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_2.addCircle(-5, 10, 20)
+SketchLine_4 = Sketch_2.addLine(-25, 10, 15, 10)
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_4.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchCircle_1.results()[1])
+model.do()
+Face_1 = model.addFace(Part_1_doc, [model.selection("COMPOUND", "all-in-Sketch_1"), model.selection("COMPOUND", "Sketch_2")])
+model.end()
+
+model.testNbResults(Face_1, 3)
+model.testNbSubShapes(Face_1, GeomAPI_Shape.FACE, [1, 1, 1])
+model.testNbSubShapes(Face_1, GeomAPI_Shape.EDGE, [3, 2, 2])
+model.testNbSubShapes(Face_1, GeomAPI_Shape.VERTEX, [6, 4, 4])
+model.testResultsVolumes(Face_1, [441.0539215686274, 628.318530717958, 628.318530717958])
+
+assert(model.checkPythonDump())
--- /dev/null
+# 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 GeomAPI import *
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(0, -20, 45, -15)
+SketchLine_2 = Sketch_1.addLine(45, -15, 10, 15)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(10, 15, 25, -40)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_2.addCircle(-5, 10, 20)
+SketchLine_4 = Sketch_2.addLine(-25, 10, 15, 10)
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_4.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchCircle_1.results()[1])
+model.do()
+Shell_1 = model.addShell(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")])
+model.end()
+
+model.testNbResults(Shell_1, 1)
+model.testNbSubShapes(Shell_1, GeomAPI_Shape.FACE, [1])
+model.testNbSubShapes(Shell_1, GeomAPI_Shape.EDGE, [3])
+model.testNbSubShapes(Shell_1, GeomAPI_Shape.VERTEX, [6])
+model.testResultsVolumes(Shell_1, [441.0539215686274])
+
+assert(model.checkPythonDump())
--- /dev/null
+# 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 GeomAPI import *
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(0, -20, 45, -15)
+SketchLine_2 = Sketch_1.addLine(45, -15, 10, 15)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(10, 15, 25, -40)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchCircle_1 = Sketch_2.addCircle(-5, 10, 20)
+SketchLine_4 = Sketch_2.addLine(-25, 10, 15, 10)
+SketchConstraintCoincidence_3 = Sketch_2.setCoincident(SketchLine_4.startPoint(), SketchCircle_1.results()[1])
+SketchConstraintCoincidence_4 = Sketch_2.setCoincident(SketchLine_4.endPoint(), SketchCircle_1.results()[1])
+model.do()
+Shell_1 = model.addShell(Part_1_doc, [model.selection("COMPOUND", "all-in-Sketch_1"), model.selection("COMPOUND", "Sketch_2")])
+model.end()
+
+model.testNbResults(Shell_1, 2)
+model.testNbSubShapes(Shell_1, GeomAPI_Shape.FACE, [1, 2])
+model.testNbSubShapes(Shell_1, GeomAPI_Shape.EDGE, [3, 4])
+model.testNbSubShapes(Shell_1, GeomAPI_Shape.VERTEX, [6, 8])
+model.testResultsVolumes(Shell_1, [441.0539215686274, 1256.637061435917])
+
+assert(model.checkPythonDump())
# Test results
assert (len(aVertexFeature.results()) == aNumOfPoints)
-# Check Vertex feature failed on incorrect input
+# Check Vertex feature correct on a whole sketch
aSession.startOperation()
aVertexFeature2 = aPart.addFeature("Vertex")
aBaseObjectsList = aVertexFeature2.selectionList("base_objects")
aBaseObjectsList.append(aSketchResult, None)
aSession.finishOperation()
-assert (len(aVertexFeature2.results()) == 0)
+assert (len(aVertexFeature2.results()) == aNumOfPoints)
+# Check Vertex feature failed on incorrect input
aSession.startOperation()
aLine = aSketchFeature.addFeature("SketchLine")
geomDataAPI_Point2D(aLine.attribute("StartPoint")).setValue(0, 0)
geomDataAPI_Point2D(aLine.attribute("EndPoint")).setValue(100, 100)
aSession.finishOperation()
aSession.startOperation()
-aBaseObjectsList.clear()
+aPart.setCurrentFeature(aVertexFeature2, False)
+aSession.finishOperation()
+aSession.startOperation()
+aVertexFeature3 = aPart.addFeature("Vertex")
+aBaseObjectsList = aVertexFeature3.selectionList("base_objects")
aBaseObjectsList.append(aSketchResult, aLine.lastResult().shape())
aSession.finishOperation()
-assert (len(aVertexFeature2.results()) == 0)
+assert (len(aVertexFeature3.results()) == 0)
# remove failed feature
aSession.startOperation()
-aPart.removeFeature(aVertexFeature2)
-aPart.setCurrentFeature(aVertexFeature, True)
+aPart.removeFeature(aVertexFeature3)
aSession.finishOperation()
from salome.shaper import model
--- /dev/null
+# 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 GeomAPI import *
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(0, -20, 45, -15)
+SketchLine_2 = Sketch_1.addLine(45, -15, 10, 15)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(10, 15, 25, -40)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchArc_1 = Sketch_2.addArc(-5, 10, -5, -10, 15, 10, False)
+model.do()
+Vertex_1 = model.addVertex(Part_1_doc, [model.selection("COMPOUND", "all-in-Sketch_1"), model.selection("COMPOUND", "Sketch_2")], False)
+model.end()
+
+model.testNbResults(Vertex_1, 7)
+model.testNbSubShapes(Vertex_1, GeomAPI_Shape.VERTEX, [1, 1, 1, 1, 1, 1, 1])
+
+assert(model.checkPythonDump())
--- /dev/null
+# 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 GeomAPI import *
+
+model.begin()
+partSet = model.moduleDocument()
+Part_1 = model.addPart(partSet)
+Part_1_doc = Part_1.document()
+Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchLine_1 = Sketch_1.addLine(0, -20, 45, -15)
+SketchLine_2 = Sketch_1.addLine(45, -15, 10, 15)
+SketchConstraintCoincidence_1 = Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
+SketchLine_3 = Sketch_1.addLine(10, 15, 25, -40)
+SketchConstraintCoincidence_2 = Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
+model.do()
+Sketch_2 = model.addSketch(Part_1_doc, model.defaultPlane("XOY"))
+SketchArc_1 = Sketch_2.addArc(-5, 10, -5, -10, 15, 10, False)
+model.do()
+Vertex_1 = model.addVertex(Part_1_doc, [model.selection("COMPOUND", "all-in-Sketch_1"), model.selection("COMPOUND", "Sketch_2")], True)
+model.end()
+
+model.testNbResults(Vertex_1, 9)
+model.testNbSubShapes(Vertex_1, GeomAPI_Shape.VERTEX, [1, 1, 1, 1, 1, 1, 1, 1, 1])
+
+assert(model.checkPythonDump())
tooltip="Select edges, wires or faces."
shape_types="edges wires faces"
concealment="true">
- <validator id="BuildPlugin_ValidatorBaseForBuild" parameters="edge,wire,face"/>
+ <validator id="BuildPlugin_ValidatorBaseForBuild" parameters="edge,wire,face,compound"/>
</multi_selector>
<validator id="BuildPlugin_ValidatorBaseForFace" parameters="base_objects"/>
</source>
tooltip="Select faces or shells objects."
shape_types="faces shells"
concealment="true">
- <validator id="BuildPlugin_ValidatorBaseForBuild" parameters="face,shell"/>
+ <validator id="BuildPlugin_ValidatorBaseForBuild" parameters="face,shell,compound"/>
</multi_selector>
</source>
<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>
SET(TEXT_RESOURCES
CollectionPlugin_msg_en.ts
+ CollectionPlugin_msg_fr.ts
)
# sources / moc wrappings
--- /dev/null
+<?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'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'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'objets</translation>
+ </message>
+ </context>
+ <context>
+ <name>Group:group_list:GeomValidators_BodyShapes</name>
+ <message>
+ <source>Error: Context is empty.</source>
+ <translation>L'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'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'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'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'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'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'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'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>
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
)
SET(TEXT_RESOURCES
-# ConnectorPlugin_msg_fr.ts
+ ConnectorPlugin_msg_fr.ts
)
SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
--- /dev/null
+<?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>
SET(TEXT_RESOURCES
ConstructionPlugin_msg_en.ts
+ ConstructionPlugin_msg_fr.ts
)
SET(PROJECT_LIBRARIES
--- /dev/null
+<?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'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'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'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'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'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'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'é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'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'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'é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'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'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'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'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'axe.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Plane:axis:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'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'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'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'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'objet</translation>
+ </message>
+ <message>
+ <source>By intersection of objects</source>
+ <translation>Par intersection d'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'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>
//
/* 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"
/// 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;
SET(TEXT_RESOURCES
ExchangePlugin_msg_en.ts
+ ExchangePlugin_msg_fr.ts
)
SET(PROJECT_LIBRARIES
--- /dev/null
+<?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'attribut "%1" n'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'export n'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'export n'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'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'attribut %1 n'est pas initialisé.</translation>
+ </message>
+ <message>
+ <source>%1 is not a string attribute.</source>
+ <translation>L'attribut %1 n'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'export</translation>
+ </message>
+ </context>
+ <context>
+ <name>Export:selection_list</name>
+ <message>
+ <source>Select a set of objects</source>
+ <translation>Sélectionnez un ensemble d'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'il vous plaît saisissez l'auteur</translation>
+ </message>
+ </context>
+ <context>
+ <name>Export:xao_file_path</name>
+ <message>
+ <source>Export file</source>
+ <translation>Fichier d'export</translation>
+ </message>
+ </context>
+ <context>
+ <name>Export:xao_file_path:ExchangePlugin_ExportFormat</name>
+ <message>
+ <source>%1 is not initialized.</source>
+ <translation>%1 n'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'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'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'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>
theDumper << ", " << anAttrToObject << ", " << anAttrToOffset <<
", " << anAttrFromObject << ", " << anAttrFromOffset;
+ } else {
+ // Through all
}
AttributeSelectionListPtr anAttrBoolObjects =
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,
}
}
+//==================================================================================================
+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,
}
}
+//==================================================================================================
+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,
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,
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,
}
}
+//==================================================================================================
+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,
}
}
+//==================================================================================================
+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,
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,
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,
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,
/// 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
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
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,
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,
/// 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
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
//==================================================================================================
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);
theDumper << ", " << anAttrToObject << ", " << anAttrToOffset <<
", " << anAttrFromObject << ", " << anAttrFromOffset;
+ } else {
+ // Through All
}
AttributeSelectionListPtr anAttrBoolObjects =
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,
}
}
+//==================================================================================================
+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,
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,
}
}
+//==================================================================================================
+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,
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,
/// 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
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,
/// 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
SET(TEXT_RESOURCES
FeaturesPlugin_msg_en.ts
+ FeaturesPlugin_msg_fr.ts
FeaturesPlugin_msg_ru.ts
)
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
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
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()) {
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 {
+ }
+}
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()
{
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
#include "FeaturesPlugin_ExtrusionBoolean.h"
+#include <ModelAPI_AttributeSelectionList.h>
+#include <ModelAPI_AttributeString.h>
+
+#include <GeomAlgoAPI_ShapeTools.h>
+
//=================================================================================================
void FeaturesPlugin_ExtrusionBoolean::initAttributes()
{
{
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);
+ }
+}
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
#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()
{
//=================================================================================================
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);
}
/// 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();
/// Creates a new part document if needed.
FEATURESPLUGIN_EXPORT virtual void execute();
+
+ private:
+ void executeFuseThroughAll();
};
#endif
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.
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()
{
--- /dev/null
+<?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'arguments pour l'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'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><base sketch></source>
+ <translation><esquisse de base></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 "à partir" 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><base sketch></source>
+ <translation><esquisse de base></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 "au" 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><base normal></source>
+ <translation><base normale></translation>
+ </message>
+ </context>
+ <context>
+ <name>Extrusion:sketch</name>
+ <message>
+ <source>Select:<br /> 1. Planar face of non-sketch object or a plane. Sketch creation will be started.<br /> 2. An existing sketch face or contour. Extrusion will be filled by it.<br /> 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+ <translation>Sélectionnez : <br /> 1. Face plane d'un objet non esquissé ou d'un plan. La création de l’esquisse sera lancée. <br /> 2. Une face ou un contour d’esquisse existant. L'extrusion sera remplie par elle. <br /> 3. Une forme de résultat existante de type: contours / arête / sommets. L'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'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'esquisse</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionCut:base</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>Sélectionnez une face d'esquisse.</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionCut:direction_object</name>
+ <message>
+ <source><base normal></source>
+ <translation><base normale></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><base sketch></source>
+ <translation><esquisse de base></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><base sketch></source>
+ <translation><esquisse de base></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:<br /> 1. Planar face of non-sketch object or a plane. Sketch creation will be started.<br /> 2. An existing sketch face or contour. Extrusion will be filled by it.<br /> 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+ <translation>Sélectionnez : <br /> 1. Face plane d'un objet non esquissé ou d'un plan. La création de l’esquisse sera lancée. <br /> 2. Une face ou un contour d’esquisse existant. L'extrusion sera remplie par elle. <br /> 3. Une forme de résultat existante de type: contours / arête / sommets. L'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'algorithme d'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'algorithme d'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'esquisse</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionFuse:direction_object</name>
+ <message>
+ <source><base normal></source>
+ <translation><base normale></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><base sketch></source>
+ <translation><esquisse de base></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><base sketch></source>
+ <translation><esquisse de base></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:<br /> 1. Planar face of non-sketch object or a plane. Sketch creation will be started.<br /> 2. An existing sketch face or contour. Extrusion will be filled by it.<br /> 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+ <translation>Sélectionnez : <br /> 1. Face plane d'un objet non esquissé ou d'un plan. La création de l’esquisse sera lancée. <br /> 2. Une face ou un contour d’esquisse existant. L'extrusion sera remplie par elle. <br /> 3. Une forme de résultat existante de type: contours / arête / sommets. L'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'algorithme d'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'algorithme d'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'arguments pour l'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'intersection</translation>
+ </message>
+ <message>
+ <source>Remove intersection edges if they laying on the same surface</source>
+ <translation>Supprimez les arêtes d'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'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'attribut "%1" 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'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'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'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'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'angle</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:from_object</name>
+ <message>
+ <source><base sketch></source>
+ <translation><esquisse de base></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 "à partir du" 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><base sketch></source>
+ <translation><esquisse de base></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 "à" plan</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:sketch</name>
+ <message>
+ <source>Select:<br /> 1. Planar face of non-sketch object or a plane. Sketch creation will be started.<br /> 2. An existing sketch face or contour. Extrusion will be filled by it.<br /> 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+ <translation>Sélectionnez : <br /> 1. Face plane d'un objet non esquissé ou d'un plan. La création de l’esquisse sera lancée. <br /> 2. Une face ou un contour d’esquisse existant. L'extrusion sera remplie par elle. <br /> 3. Une forme de résultat existante de type: contours / arête / sommets. L'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'axe de révolution n'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'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'axe</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:base</name>
+ <message>
+ <source>Select a sketch face</source>
+ <translation>Sélectionnez une face d'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'angle</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:from_object</name>
+ <message>
+ <source><sketch></source>
+ <translation><esquisse></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 "à partir du" 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><sketch></source>
+ <translation><esquisse></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 "à" plan</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:sketch</name>
+ <message>
+ <source>Select:<br /> 1. Planar face of non-sketch object or a plane. Sketch creation will be started.<br /> 2. An existing sketch face or contour. Extrusion will be filled by it.<br /> 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+ <translation>Sélectionnez : <br /> 1. Face plane d'un objet non esquissé ou d'un plan. La création de l’esquisse sera lancée. <br /> 2. Une face ou un contour d’esquisse existant. L'extrusion sera remplie par elle. <br /> 3. Une forme de résultat existante de type: contours / arête / sommets. L'extrusion sera remplie par elle.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:axis_object</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'axe de révolution n'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'axe</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:base</name>
+ <message>
+ <source>Select a sketch face</source>
+ <translation>Sélectionnez une face d'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'angle</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:from_object</name>
+ <message>
+ <source><sketch></source>
+ <translation><esquisse></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 "à partir du" 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><sketch></source>
+ <translation><esquisse></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 "à" plan</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:sketch</name>
+ <message>
+ <source>Select:<br /> 1. Planar face of non-sketch object or a plane. Sketch creation will be started.<br /> 2. An existing sketch face or contour. Extrusion will be filled by it.<br /> 3. An existing result shape of kind: wires/edge/vertices. Extrusion will be filled by it.</source>
+ <translation>Sélectionnez : <br /> 1. Face plane d'un objet non esquissé ou d'un plan. La création de l’esquisse sera lancée. <br /> 2. Une face ou un contour d’esquisse existant. L'extrusion sera remplie par elle. <br /> 3. Une forme de résultat existante de type: contours / arête / sommets. L'extrusion sera remplie par elle.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:axis_object</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'axe de révolution n'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'échelle</translation>
+ </message>
+ </context>
+ <context>
+ <name>Scale:scale_factor_x</name>
+ <message>
+ <source>Scale factor in X</source>
+ <translation>Facteur d'échelle suivant X</translation>
+ </message>
+ </context>
+ <context>
+ <name>Scale:scale_factor_y</name>
+ <message>
+ <source>Scale factor in Y</source>
+ <translation>Facteur d'échelle suivant Y</translation>
+ </message>
+ </context>
+ <context>
+ <name>Scale:scale_factor_z</name>
+ <message>
+ <source>Scale factor in Z</source>
+ <translation>Facteur d'é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'objet de base pour l'extrusion n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Extrusion:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'objet n'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 "FeaturesPlugin_ValidatorExtrusionDir" doit être utilisé avec 2 paramètres d'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'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'objet de base pour l'extrusion n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Extrusion:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "base" is not initialized.</source>
+ <translation>L'objet de base pour l'extrusion n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Extrusion:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "direction_object" is not initialized.</source>
+ <translation>L'objet Direction pour l'extrusion n'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'extrusion n'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'extrusion n'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'attribut avec le type %1 n'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'objet de cette esquisse est déjà sélectionné. L'esquisse n'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'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'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'attribut avec le type %1 n'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'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'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'attribut avec le type %1 n'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'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'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'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'extrusion.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Extrusion:from_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+ <message>
+ <source>Error: Extrusion algorithm failed.</source>
+ <translation>Erreur : l'algorithme d'extrusion a échoué.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Extrusion:to_object:FeaturesPlugin_ValidatorExtrusionBoundary</name>
+ <message>
+ <source>Error: Extrusion algorithm failed.</source>
+ <translation>Erreur : l'algorithme d'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'objet de base pour l'extrusion n'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'objet n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'objet n'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 "FeaturesPlugin_ValidatorExtrusionDir" doit être utilisé avec 2 paramètres d'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'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'objet de base pour l'extrusion n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionCut:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "direction_object" is not initialized.</source>
+ <translation>L'objet Direction pour l'extrusion n'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'extrusion n'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'extrusion n'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 "jusqu’à".</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'attribut avec le type %1 n'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'objet de cette esquisse est déjà sélectionné. L'esquisse n'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'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionCut:direction_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'attribut avec le type %1 n'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'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'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'attribut avec le type %1 n'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionCut:main_objects:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'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'axe de révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de révolution n'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'arguments du validateur "GeomValidators_ZeroOffset" 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'objet de base pour la révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "base" is not initialized.</source>
+ <translation>L'objet de base pour la révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "axis_object" is not initialized.</source>
+ <translation>L'axe de révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "from_object" is not initialized.</source>
+ <translation>L'objet de départ pour la révolution n'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'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'objet n'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'attribut avec le type %1 n'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'objet de cette esquisse est déjà sélectionné. L'esquisse n'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'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>Revolution:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de révolution n'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'attribut avec le type %1 n'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'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'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'attribut avec le type %1 n'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'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'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'axe de révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de révolution n'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'objet n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'objet n'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'arguments du validateur "GeomValidators_ZeroOffset" 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'objet de base pour la révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "base" is not initialized.</source>
+ <translation>L'objet de base pour la révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "axis_object" is not initialized.</source>
+ <translation>L'axe de révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "from_object" is not initialized.</source>
+ <translation>L'objet de départ pour la révolution n'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'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'attribut avec le type %1 n'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'objet de cette esquisse est déjà sélectionné. L'esquisse n'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'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de révolution n'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'attribut avec le type %1 n'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'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'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'attribut avec le type %1 n'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionCut:main_objects:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'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'objet n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'objet n'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 "FeaturesPlugin_ValidatorExtrusionDir" doit être utilisé avec 2 paramètres d'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'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'objet de base pour l'extrusion n'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'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'objet Direction pour l'extrusion n'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'extrusion n'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'extrusion n'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'attribut avec le type %1 n'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'objet de cette esquisse est déjà sélectionné. L'esquisse n'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'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionFuse:direction_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'attribut avec le type %1 n'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'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'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'attribut avec le type %1 n'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>ExtrusionFuse:main_objects:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'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'axe de révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de révolution n'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'objet n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:sketch:FeaturesPlugin_ValidatorCompositeLauncher</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'objet n'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'arguments du validateur "GeomValidators_ZeroOffset" 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'objet de base pour la révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "base" is not initialized.</source>
+ <translation>L'objet de base pour la révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "axis_object" is not initialized.</source>
+ <translation>L'axe de révolution n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "from_object" is not initialized.</source>
+ <translation>L'objet de départ pour la révolution n'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'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'attribut avec le type %1 n'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'objet de cette esquisse est déjà sélectionné. L'esquisse n'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'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de révolution n'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'attribut avec le type %1 n'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'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'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'attribut avec le type %1 n'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>RevolutionFuse:main_objects:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'opération</translation>
+ </message>
+ <message>
+ <source>Type of boolean operation</source>
+ <translation>Type d'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'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'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 "%1"</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 "GeomValidators_MinObjectsSelected" (2 attendus) : id de la liste de sélection et nombre minimal d'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'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'objet de base pour le tuyau n'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'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Pipe:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "path_object" is not initialized.</source>
+ <translation>L'objet pour le chemin de canal n'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'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Pipe:path_object:FeaturesPlugin_ValidatorPipePath</name>
+ <message>
+ <source>Error: Empty context.</source>
+ <translation>L'objet pour le chemin de canal n'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'obtenir l'attribut " %1"</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'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'objet de base pour le tuyau n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Pipe:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "path_object" is not initialized.</source>
+ <translation>L'objet pour le chemin de canal n'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'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'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'objet de cette esquisse est déjà sélectionné. L'esquisse n'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'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'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'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'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'objet pour le chemin de canal n'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>Pipe:binormal:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'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'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'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'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'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'obtenir l'attribut " %1".</translation>
+ </message>
+ </context>
+ <context>
+ <name>Remove_SubShapes:FeaturesPlugin_ValidatorRemoveSubShapesResult</name>
+ <message>
+ <source>Error: Base shape is empty.</source>
+ <translation>La forme de base n'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'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'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2"</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>Remove_SubShapes:base_shape:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'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'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'obtenir l'attribut \"%1\".</translation>
+ </message>
+ </context>
+ <context>
+ <name>Remove_SubShapes:subshapes:FeaturesPlugin_ValidatorRemoveSubShapesSelection</name>
+ <message>
+ <source>Error: Empty context.</source>
+ <translation>L'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'attribut est vide.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Intersection:tool_objects:GeomValidators_IntersectionSelection</name>
+ <message>
+ <source>Error: empty selection context.</source>
+ <translation>L'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'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'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'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'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'attribut avec le type %1 n'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'est pas définie.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Rotation:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "angle" is not initialized.</source>
+ <translation>L'angle n'est pas défini.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Rotation:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "axis_object" is not initialized.</source>
+ <translation>L'axe de rotation n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de rotation n'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 "%1", il devrait être "%2".</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'attribut avec le type %1 n'est pas traité.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de rotation n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'axe de rotation n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Rotation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The shape is empty</source>
+ <translation>L'axe de rotation n'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'axe de rotation n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Rotation:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "angle" is not initialized.</source>
+ <translation>L'angle n'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'attribut avec le type %1 n'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'axe de translation n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Translation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'axe de translation n'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'élément avec un type de forme acceptable. Le type devrait être l'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 "%1", il devrait être "%2".</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'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>Translation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'axe de translation n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Translation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The shape is empty</source>
+ <translation>L'axe de translation n'est pas sélectionné.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Translation:axis_object:GeomValidators_ShapeType</name>
+ <message>
+ <source>The shape is empty</source>
+ <translation>L'axe de translation n'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'attribut avec le type %1 n'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'obtenir l'attribut " %1".</translation>
+ </message>
+ </context>
+ <context>
+ <name>Union:FeaturesPlugin_ValidatorUnionArguments</name>
+ <message>
+ <source>Error: Not all shapes have shared topology.</source>
+ <translation>La topologie n'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'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'arguments incorrect (2 attendus): id de la liste de sélection et nombre minimal d'objets</translation>
+ </message>
+ </context>
+ <context>
+ <name>Union:GeomValidators_MinObjectsSelected</name>
+ <message>
+ <source>Error: Could not get attribute \"%1\".</source>
+ <translation>Erreur : impossible d'obtenir l'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'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'axe de rotation</translation>
+ </message>
+ </context>
+ <context>
+ <name>AngularCopy:axis_angular:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'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'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'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'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'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'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'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'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'un par rapport à l'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'axe avec l'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'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'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'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'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'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'axe</translation>
+ </message>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'axe de translation n'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'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'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>
--- /dev/null
+# 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())
--- /dev/null
+# 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())
--- /dev/null
+# 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())
--- /dev/null
+# 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())
--- /dev/null
+
+ .. _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>`
+
--- /dev/null
+
+ .. _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>`
+
--- /dev/null
+
+ .. _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>`
+
--- /dev/null
+
+ .. _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>`
+
--- /dev/null
+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()
--- /dev/null
+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()
--- /dev/null
+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()
--- /dev/null
+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()
.. 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
: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
--------
- **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**:
- **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**:
**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.
.. 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
: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
--------
**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.
.. 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
: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
--------
.. 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.
.. 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
: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
--------
.. 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.
</doublevalue>
</groupbox>
</box>
+ <box id="ThroughAll" title="Through all" icon="icons/Features/extrusion_throughall_32x32.png">
+ </box>
</toolbox>
</groupbox>
<multi_selector id="main_objects"
</doublevalue>
</groupbox>
</box>
+ <box id="ThroughAll" title="Through all" icon="icons/Features/extrusion_throughall_32x32.png">
+ </box>
</toolbox>
</groupbox>
<multi_selector id="main_objects"
</doublevalue>
</groupbox>
</box>
+ <box id="ThroughAll" title="Through all" icon="icons/Features/revol_throughall_32x32.png">
+ </box>
</toolbox>
</groupbox>
<multi_selector id="main_objects"
</doublevalue>
</groupbox>
</box>
+ <box id="ThroughAll" title="Through all" icon="icons/Features/revol_throughall_32x32.png">
+ </box>
</toolbox>
</groupbox>
<multi_selector id="main_objects"
return aPoint1.IsEqual(aPoint2, Precision::Confusion()) == Standard_True;
}
+
+
+
+bool GeomAPI_Vertex::GeometricComparator::operator()(const GeomVertexPtr& theVertex1,
+ const GeomVertexPtr& theVertex2) const
+{
+ const TopoDS_Vertex& aVertex1 = theVertex1->impl<TopoDS_Vertex>();
+ const TopoDS_Vertex& aVertex2 = theVertex2->impl<TopoDS_Vertex>();
+
+ gp_Pnt aPnt1 = BRep_Tool::Pnt(aVertex1);
+ gp_Pnt aPnt2 = BRep_Tool::Pnt(aVertex2);
+
+ bool isLess = aPnt1.X() + myTolerance < aPnt2.X();
+ if (!isLess && aPnt1.X() <= aPnt2.X() + myTolerance) {
+ isLess = aPnt1.Y() + myTolerance < aPnt2.Y();
+ if (!isLess && aPnt1.Y() <= aPnt2.Y() + myTolerance)
+ isLess = aPnt1.Z() + myTolerance < aPnt2.Z();
+ }
+ return isLess;
+}
/// Returns true if the current edge is geometrically equal to the given edge.
GEOMAPI_EXPORT
virtual bool isEqual(const std::shared_ptr<GeomAPI_Shape> theVert) const;
+
+public:
+ /// \brief Compare vertices geometrically
+ class GeometricComparator
+ {
+ public:
+ GEOMAPI_EXPORT
+ GeometricComparator(const double theTolerance = 1.e-7) : myTolerance(theTolerance)
+ {}
+
+ /// Return \c true if the first vertex is less than the second
+ GEOMAPI_EXPORT
+ bool operator ()(const std::shared_ptr<GeomAPI_Vertex>& theVertex1,
+ const std::shared_ptr<GeomAPI_Vertex>& theVertex2) const;
+ private:
+ double myTolerance;
+ };
+
};
//! Pointer on the object
GeomAlgoAPI_Prism.h
GeomAlgoAPI_Revolution.h
GeomAlgoAPI_Boolean.h
+ GeomAlgoAPI_ThroughAll.h
GeomAlgoAPI_Rotation.h
GeomAlgoAPI_Translation.h
GeomAlgoAPI_MakeShape.h
GeomAlgoAPI_Offset.h
GeomAlgoAPI_SolidClassifier.h
GeomAlgoAPI_MapShapesAndAncestors.h
+ GeomAlgoAPI_Projection.h
GeomAlgoAPI_Chamfer.h
)
GeomAlgoAPI_Prism.cpp
GeomAlgoAPI_Revolution.cpp
GeomAlgoAPI_Boolean.cpp
+ GeomAlgoAPI_ThroughAll.cpp
GeomAlgoAPI_Rotation.cpp
GeomAlgoAPI_Translation.cpp
GeomAlgoAPI_MakeShape.cpp
/// 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.
#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)
return aFixedWire;
}
+//==================================================================================================
std::shared_ptr<GeomAPI_Edge> GeomAlgoAPI_ShapeTools::wireToEdge(
const std::shared_ptr<GeomAPI_Wire>& theWire)
{
return anEdge;
}
+//==================================================================================================
ListOfShape GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(const GeomShapePtr& theShape)
{
ListOfShape aSubShapes;
}
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;
+ }
+ }
+}
/// \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
--- /dev/null
+// 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);
+}
--- /dev/null
+// 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
INCLUDE_DIRECTORIES(
../GeomAPI # only for SWIG
+ ../Events # only for SWIG
../ModelAPI
)
#include <GeomAPI_swig.h>
#include <ModelAPI_swig.h>
+ #include <Events_MessageGroup.h>
#include "GeomDataAPI.h"
#include "GeomDataAPI_Point.h"
if(theFeature->string(*anIt)) {
aSelectedMethod = theFeature->string(*anIt)->value();
}
+ if (aSelectedMethod == "ThroughAll") return true;
anIt++;
std::string aCreationMethod = *anIt;
anIt++;
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);
}
}
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);
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})
// import other modules
%import "GeomAPI.i"
+%import "Events.i"
// to avoid error on this
#define MODELAPI_EXPORT
%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);
%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>;
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;
/// 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
{
#include <ModelAPI_ResultPart.h>
#include <ModelAPI_AttributeDocRef.h>
#include <ModelAPI_Validator.h>
+#include <ModelAPI_AttributeIntArray.h>
#include <list>
#include <map>
#include <iostream>
}
}
+// used by GUI only
+// LCOV_EXCL_START
+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;
+}
+// LCOV_EXCL_STOP
+
} // namespace ModelAPI_Tools
/*! 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
#include "ModelAPI.h"
#include "ModelAPI_Entity.h"
+ #include "ModelAPI_Events.h"
#include "ModelAPI_Document.h"
#include "ModelAPI_Session.h"
#include "ModelAPI_Object.h"
)
SET(TEXT_RESOURCES
-# ModuleBase_msg_fr.ts
+ ModuleBase_msg_fr.ts
)
SET(PROJECT_LIBRARIES
QT5_CREATE_TRANSLATION(QM_RESOURCES
${PROJECT_FILES}
${TEXT_RESOURCES}
- OPTIONS -extensions cpp -no-recursive
+ OPTIONS -extensions cpp -no-recursive -locations none
)
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})
}
}
-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
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*>
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,
/// 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
/// \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;
//**************************************************************
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");
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;
#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();
}
bool myIsValueStateBlocked;
/// do not flush updated signal
bool myFlushUpdateBlocked;
+
+ bool myUpdateVisualAttributes;
};
#endif
// (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));
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;
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
}
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();
//********************************************************************
void ModuleBase_WidgetMultiSelector::onListSelection()
{
- myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
- true);
+ myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
+ true);
}
//********************************************************************
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+ <name>ExpressionEditor</name>
+ <message>
+ <source>Ctrl+Space</source>
+ <comment>Complete</comment>
+ <translation>Ctrl+Espace</translation>
+ </message>
+</context>
+<context>
+ <name>ModuleBase_FilterItem</name>
+ <message>
+ <source>Reverse the filter</source>
+ <translation>Inverser le filtre</translation>
+ </message>
+ <message>
+ <source>Delete the filter</source>
+ <translation>Supprimer le filtre</translation>
+ </message>
+</context>
+<context>
+ <name>ModuleBase_FilterStarter</name>
+ <message>
+ <source>Selection by filters</source>
+ <translation>Sélection par filtres</translation>
+ </message>
+</context>
+<context>
+ <name>ModuleBase_ListView</name>
+ <message>
+ <source>Copy</source>
+ <translation>Copie</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Effacer</translation>
+ </message>
+</context>
+<context>
+ <name>ModuleBase_PreferencesDlg</name>
+ <message>
+ <source>Edit preferences</source>
+ <translation>Modifier les préférences</translation>
+ </message>
+ <message>
+ <source>Default</source>
+ <translation>Défaut</translation>
+ </message>
+ <message>
+ <source>Desktop</source>
+ <translation>Bureau</translation>
+ </message>
+ <message>
+ <source>Module</source>
+ <translation>Module</translation>
+ </message>
+ <message>
+ <source>Viewer</source>
+ <translation>Vue</translation>
+ </message>
+ <message>
+ <source>Horizontal gradient</source>
+ <translation>Dégradé horizontal</translation>
+ </message>
+ <message>
+ <source>Vertical gradient</source>
+ <translation>Gradient vertical</translation>
+ </message>
+ <message>
+ <source>First diagonal gradient</source>
+ <translation>Premier gradient en diagonale</translation>
+ </message>
+ <message>
+ <source>Second diagonal gradient</source>
+ <translation>Deuxième gradient diagonal</translation>
+ </message>
+ <message>
+ <source>First corner gradient</source>
+ <translation>Premier angle de dégradé</translation>
+ </message>
+ <message>
+ <source>Second corner gradient</source>
+ <translation>Deuxième angle du dégradé</translation>
+ </message>
+ <message>
+ <source>Third corner gradient</source>
+ <translation>Troisième angle de dégradé</translation>
+ </message>
+ <message>
+ <source>Fourth corner gradient</source>
+ <translation>Quatrième angle</translation>
+ </message>
+ <message>
+ <source>Background</source>
+ <translation>Arrière-plan</translation>
+ </message>
+ <message>
+ <source>Viewer 3d</source>
+ <translation>Vue 3d</translation>
+ </message>
+ <message>
+ <source>Default selection</source>
+ <translation>Sélection par défaut</translation>
+ </message>
+ <message>
+ <source>Faces</source>
+ <translation>Faces</translation>
+ </message>
+ <message>
+ <source>Edges</source>
+ <translation>Arêtes</translation>
+ </message>
+ <message>
+ <source>Vertices</source>
+ <translation>Sommets</translation>
+ </message>
+ <message>
+ <source>Selection sensitivity</source>
+ <translation>Sensibilité de sélection</translation>
+ </message>
+ <message>
+ <source>Vertex</source>
+ <translation>Sommet</translation>
+ </message>
+ <message>
+ <source>Edge</source>
+ <translation>Bord</translation>
+ </message>
+ <message>
+ <source>Additional highlighting</source>
+ <translation>Mise en évidence supplémentaire</translation>
+ </message>
+ <message>
+ <source>In 3d mode</source>
+ <translation>En mode 3D</translation>
+ </message>
+ <message>
+ <source>In 2d mode</source>
+ <translation>En mode 2D</translation>
+ </message>
+ <message>
+ <source>Color scale</source>
+ <translation>Échelle de couleur</translation>
+ </message>
+ <message>
+ <source>X position</source>
+ <translation>Position X</translation>
+ </message>
+ <message>
+ <source>Y position</source>
+ <translation>Position Y</translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation>Largeur</translation>
+ </message>
+ <message>
+ <source>Height</source>
+ <translation>Hauteur</translation>
+ </message>
+ <message>
+ <source>Intervals number</source>
+ <translation>Nombre d'intervalles</translation>
+ </message>
+ <message>
+ <source>Text height</source>
+ <translation>Hauteur du texte</translation>
+ </message>
+ <message>
+ <source>Text color</source>
+ <translation>Couleur du texte</translation>
+ </message>
+ <message>
+ <source>Main menu</source>
+ <translation>Menu principal</translation>
+ </message>
+ <message>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <source>Number of rows</source>
+ <translation>Nombre de rangées</translation>
+ </message>
+ <message>
+ <source>Show Status Bar</source>
+ <translation>Afficher la barre d'état</translation>
+ </message>
+</context>
+<context>
+ <name>ModuleBase_WidgetFileSelector</name>
+ <message>
+ <source>Select file...</source>
+ <translation>Choisir le dossier...</translation>
+ </message>
+</context>
+<context>
+ <name>ModuleBase_WidgetMultiSelector</name>
+ <message>
+ <source>Type</source>
+ <translation>Type</translation>
+ </message>
+ <message>
+ <source>Show only</source>
+ <translation>Montrer seulement</translation>
+ </message>
+ <message>
+ <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>
+ <source>X coordinate</source>
+ <translation>Coordonnée X</translation>
+ </message>
+ <message>
+ <source>Y coordinate</source>
+ <translation>Coordonnée Y</translation>
+ </message>
+ <message>
+ <source>Z coordinate</source>
+ <translation>Coordonnée Z</translation>
+ </message>
+</context>
+<context>
+ <name>ModuleBase_WidgetSelectionFilter</name>
+ <message>
+ <source>Filters</source>
+ <translation>Filtres</translation>
+ </message>
+ <message>
+ <source>Add new filter...</source>
+ <translation>Ajouter un nouveau filtre...</translation>
+ </message>
+ <message>
+ <source>Select</source>
+ <translation>Sélectionner</translation>
+ </message>
+ <message>
+ <source>Number of selected objects:</source>
+ <translation>Nombre d'objets sélectionnés:</translation>
+ </message>
+ <message>
+ <source>Show only</source>
+ <translation>Montrer seulement</translation>
+ </message>
+ <message>
+ <source>Selection is empty</source>
+ <translation>La sélection est vide</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <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>
+ <source>Delete features</source>
+ <translation>Supprimer les fonctionnalités</translation>
+ </message>
+ <message>
+ <source>The following parts will be deleted: %1.
+</source>
+ <translation>Les pièces suivantes seront supprimées : %1.
+
+</translation>
+ </message>
+ <message>
+ <source>Replace</source>
+ <translation>Remplacer</translation>
+ </message>
+</context>
+</TS>
SET(TEXT_RESOURCES
ParametersPlugin_msg_ru.ts
ParametersPlugin_msg_en.ts
+ ParametersPlugin_msg_fr.ts
)
# QT4_CREATE_TRANSLATION(QM_RESOURCES
--- /dev/null
+<?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'expression.</translation>
+ </message>
+ </context>
+ <context>
+ <name>Parameter:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "expression" is not initialized.</source>
+ <translation>Définir l'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'il vous plaît entrer l'expression</translation>
+ </message>
+ </context>
+ <context>
+ <name>Parameter:expression:Parameters_ExpressionValidator</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'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'attribut "%1" 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'aperçu</translation>
+ </message>
+ <message>
+ <source><NoName></source>
+ <translation><SansNom></translation>
+ </message>
+ <message>
+ <source><NoValue></source>
+ <translation><AucuneValeur></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>
)
SET(TEXT_RESOURCES
-# PartSet_msg_fr.ts
+ PartSet_msg_fr.ts
)
SET(PROJECT_LIBRARIES
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
+ OPTIONS -extensions cpp -no-recursive -locations none
)
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})
// 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>
#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>
#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;
}
#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>
#include <ModelAPI_Tools.h>
#include <ModelAPI_ResultConstruction.h>
#include <ModelAPI_AttributeIntArray.h>
+#include <ModelAPI_ResultGroup.h>
#include <GeomDataAPI_Point2D.h>
#include <GeomDataAPI_Point.h>
#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>
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());
}
//******************************************************
-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;
}
//******************************************************
-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
{
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,
/// 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
/// 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;
#include <PartSet_SketcherMgr.h>
#include <PartSet_SketcherReentrantMgr.h>
-#include "XGUI_CustomPrs.h"
#include "XGUI_Displayer.h"
#include "XGUI_ModuleConnector.h"
#include "XGUI_OperationMgr.h"
{
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();
/// 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
#include <QMessageBox>
#include <QMainWindow>
+#include <set>
+
//#define DEBUG_DO_NOT_BY_ENTER
//#define DEBUG_SKETCHER_ENTITIES
//#define DEBUG_SKETCH_ENTITIES_ON_MOVE
: 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();
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()
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;
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) {
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;
}
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();
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++) {
aECreator->sendUpdated(aFeature, EVENT_DISP);
else
aFeature->setDisplayed(true);
+ aECreator->sendUpdated(aFeature, EVENT_ATTR);
}
#ifdef DEBUG_SKETCHER_ENTITIES
QString anInfoStr = anInfo.join(";\t");
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);
myModule->workshop()->viewer()->setFitter(0);
delete aFitter;
+ myIsSketchStarted = false;
+
myIsMouseOverWindow = false;
myIsConstraintsShown[PartSet_Tools::Geometrical] = true;
myIsConstraintsShown[PartSet_Tools::Dimensional] = true;
}
}
-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
{
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();
#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>
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
/// 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
/// 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
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);
QMap<ResultPtr, Handle(AIS_Shape)> myPointsHighlight;
bool myNoDragMoving;
+
+ bool myIsSketchStarted;
};
#include <ModelGeomAlgo_Point2D.h>
#include <Events_Loop.h>
+#include <Events_InfoMessage.h>
#include <SketcherPrs_Tools.h>
#include <GeomAPI_Pnt.h>
#include <GeomAPI_Edge.h>
#include <GeomAPI_Vertex.h>
+#include <GeomAPI_ShapeExplorer.h>
#include <GeomAPI_Dir.h>
#include <GeomAPI_XYZ.h>
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.;
+}
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
#include <ModelAPI_ResultBody.h>
#include <ModelAPI_Tools.h>
#include <ModelAPI_AttributeString.h>
+#include <ModelAPI_Events.h>
#include <ModuleBase_Operation.h>
#include <ModuleBase_ViewerPrs.h>
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);
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);
+ }
+}
class QCheckBox;
class QStackedWidget;
class QLineEdit;
+class QPushButton;
/**
* \ingroup Modules
void onChangePlane();
+ void onShowDOF();
+
private:
/// Set sketch plane by shape
/// \param theShape a planar face
QStackedWidget* myStackWidget;
QLabel* myDoFLabel;
+ QPushButton* myShowDOFBtn;
bool myOpenTransaction;
bool myIsSelection;
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+ <name>PartSet_MenuMgr</name>
+ <message>
+ <source>Auxiliary</source>
+ <translation>Auxiliaire</translation>
+ </message>
+ <message>
+ <source>Activate</source>
+ <translation>Activer</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifier...</translation>
+ </message>
+ <message>
+ <source>Detach</source>
+ <translation>Détacher</translation>
+ </message>
+ <message>
+ <source>Detach %1</source>
+ <translation>Détachez %1</translation>
+ </message>
+</context>
+<context>
+ <name>PartSet_WidgetPoint2D</name>
+ <message>
+ <source>X</source>
+ <translation>X</translation>
+ </message>
+ <message>
+ <source>Y</source>
+ <translation>Y</translation>
+ </message>
+</context>
+<context>
+ <name>PartSet_WidgetSketchCreator</name>
+ <message>
+ <source>Size of the view</source>
+ <translation>Taille de la vue</translation>
+ </message>
+ <message>
+ <source>Apply current feature</source>
+ <translation>Appliquer la fonctionnalité actuelle</translation>
+ </message>
+ <message>
+ <source>Sketch is invalid and will be deleted.
+Error: %1</source>
+ <translation>L'esquisse n'est pas valide et sera supprimée.
+Erreur : %1</translation>
+ </message>
+</context>
+<context>
+ <name>PartSet_WidgetSketchLabel</name>
+ <message>
+ <source>Size of the view</source>
+ <translation>Taille de la vue</translation>
+ </message>
+ <message>
+ <source>Remove external dependencies</source>
+ <translation>Supprimer les dépendances externes</translation>
+ </message>
+ <message>
+ <source>Sketcher plane</source>
+ <translation>Plan du Sketcher</translation>
+ </message>
+ <message>
+ <source>Reversed</source>
+ <translation>Renversé</translation>
+ </message>
+ <message>
+ <source>Set plane view</source>
+ <translation>Définir la vue plane</translation>
+ </message>
+ <message>
+ <source>Show geometrical constraints</source>
+ <translation>Afficher les contraintes géométriques</translation>
+ </message>
+ <message>
+ <source>Show dimensional constraints</source>
+ <translation>Afficher les contraintes dimensionnelles</translation>
+ </message>
+ <message>
+ <source>Show existing expressions</source>
+ <translation>Afficher les expressions existantes</translation>
+ </message>
+ <message>
+ <source>Show free points</source>
+ <translation>Afficher les points libres</translation>
+ </message>
+ <message>
+ <source>Automatic constraints</source>
+ <translation>Contraintes automatiques</translation>
+ </message>
+ <message>
+ <source>Automatic vertical and horizontal constraints</source>
+ <translation>Automatique des contraintes verticales et horizontales</translation>
+ </message>
+ <message>
+ <source>Change sketch plane</source>
+ <translation>Changer le plan d'esquisse</translation>
+ </message>
+ <message>
+ <source>Sketch is fully fixed (DoF = 0)</source>
+ <translation>L'esquisse est entièrement fixée (DdL = 0)</translation>
+ </message>
+ <message>
+ <source>DoF (degrees of freedom) = </source>
+ <translation>DdL (degrés de liberté) = </translation>
+ </message>
+ <message>
+ <source>Show remaining DoFs</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Parameters</source>
+ <translation>Paramètres</translation>
+ </message>
+ <message>
+ <source>Constructions</source>
+ <translation>Constructions</translation>
+ </message>
+ <message>
+ <source>Parts</source>
+ <translation>Pièces</translation>
+ </message>
+ <message>
+ <source>Results</source>
+ <translation>Résultats</translation>
+ </message>
+ <message>
+ <source>Fields</source>
+ <translation>Champs</translation>
+ </message>
+ <message>
+ <source>Groups</source>
+ <translation>Groupes</translation>
+ </message>
+</context>
+</TS>
)
SET(TEXT_RESOURCES
-# PartSetPlugin_msg_fr.ts
+ PartSetPlugin_msg_fr.ts
)
SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
--- /dev/null
+<?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>
)
SET(TEXT_RESOURCES
-# PrimitivesPlugin_msg_fr.ts
+ PrimitivesPlugin_msg_fr.ts
)
SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
--- /dev/null
+<?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'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'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'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'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'anneau du tore</translation>
+ </message>
+ <message>
+ <source>Ring radius</source>
+ <translation>Rayon de l'anneau</translation>
+ </message>
+ </context>
+
+</TS>
)
SET(TEXT_RESOURCES
-# SHAPERGUI_msg_fr.ts
+ SHAPERGUI_msg_fr.ts
)
IF (${UPDATE_TRANSLATION})
QT5_CREATE_TRANSLATION(QM_RESOURCES
${PROJECT_FILES}
${TEXT_RESOURCES}
- OPTIONS -extensions cpp -no-recursive
+ OPTIONS -extensions cpp -no-recursive -locations none
)
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})
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+ <name>SHAPERGUI</name>
+ <message>
+ <source>Inspection</source>
+ <translation>Inspection</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Information</translation>
+ </message>
+ <message>
+ <source>Show inspection window</source>
+ <translation>Afficher la fenêtre d'inspection</translation>
+ </message>
+ <message>
+ <source>What Is</source>
+ <translation>Qu’est-ce que c’est</translation>
+ </message>
+ <message>
+ <source>Inspection tool</source>
+ <translation>Outil d'inspection</translation>
+ </message>
+ <message>
+ <source>Edit toolbars of the module</source>
+ <translation>Editer les barres d'outils du module</translation>
+ </message>
+ <message>
+ <source>Edit toolbars...</source>
+ <translation>Editer les barres d'outils...</translation>
+ </message>
+ <message>
+ <source>Viewer</source>
+ <translation>Vue</translation>
+ </message>
+ <message>
+ <source>Default selection</source>
+ <translation>Sélection par défaut</translation>
+ </message>
+ <message>
+ <source>Faces</source>
+ <translation>Faces</translation>
+ </message>
+ <message>
+ <source>Edges</source>
+ <translation>Arêtes</translation>
+ </message>
+ <message>
+ <source>Vertices</source>
+ <translation>Sommets</translation>
+ </message>
+ <message>
+ <source>Selection sensitivity</source>
+ <translation>Sensibilité de sélection</translation>
+ </message>
+ <message>
+ <source>Vertex</source>
+ <translation>Sommet</translation>
+ </message>
+ <message>
+ <source>Edge</source>
+ <translation>Bord</translation>
+ </message>
+ <message>
+ <source>Additional highlighting</source>
+ <translation>Mise en évidence supplémentaire</translation>
+ </message>
+ <message>
+ <source>In 3d mode</source>
+ <translation>En mode 3D</translation>
+ </message>
+ <message>
+ <source>In 2d mode</source>
+ <translation>En mode 2D</translation>
+ </message>
+ <message>
+ <source>Color scale</source>
+ <translation>Échelle de couleur</translation>
+ </message>
+ <message>
+ <source>X position</source>
+ <translation>Position X</translation>
+ </message>
+ <message>
+ <source>Y position</source>
+ <translation>Position Y</translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation>Largeur</translation>
+ </message>
+ <message>
+ <source>Height</source>
+ <translation>Hauteur</translation>
+ </message>
+ <message>
+ <source>Intervals number</source>
+ <translation>Nombre d'intervalles</translation>
+ </message>
+ <message>
+ <source>Text height</source>
+ <translation>Hauteur du texte</translation>
+ </message>
+ <message>
+ <source>Text color</source>
+ <translation>Couleur du texte</translation>
+ </message>
+ <message>
+ <source>MEN_DESK_EDIT</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>SHAPERGUI_ToolbarItemsDlg</name>
+ <message>
+ <source>Edit toolbar</source>
+ <translation>Editer la barre d'outils</translation>
+ </message>
+ <message>
+ <source>Toolbar name:</source>
+ <translation>Nom de la barre d'outils:</translation>
+ </message>
+ <message>
+ <source>Out of toolbars:</source>
+ <translation>Hors des barres d'outils:</translation>
+ </message>
+ <message>
+ <source>In the toolbar:</source>
+ <translation>Dans la barre d'outils:</translation>
+ </message>
+</context>
+<context>
+ <name>SHAPERGUI_ToolbarsDlg</name>
+ <message>
+ <source>Toolbars</source>
+ <translation>Barres d'outils</translation>
+ </message>
+ <message>
+ <source>Toolbars:</source>
+ <translation>Barres d'outils:</translation>
+ </message>
+ <message>
+ <source>Number of commands out of toolbars:</source>
+ <translation>Nombre de commandes hors des barres d'outils:</translation>
+ </message>
+ <message>
+ <source>Add...</source>
+ <translation>Ajouter...</translation>
+ </message>
+ <message>
+ <source>Add a new empty toolbar to the toolbars list</source>
+ <translation>Ajouter une nouvelle barre d'outils vide à la liste des barres d'outils</translation>
+ </message>
+ <message>
+ <source>Edit...</source>
+ <translation>Modifier...</translation>
+ </message>
+ <message>
+ <source>Edit currently selected toolbar</source>
+ <translation>Modifier la barre d'outils actuellement sélectionnée</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Effacer</translation>
+ </message>
+ <message>
+ <source>Delete currently selected toolbar</source>
+ <translation>Supprimer la barre d'outils actuellement sélectionnée</translation>
+ </message>
+ <message>
+ <source>Reset</source>
+ <translation>Réinitialiser</translation>
+ </message>
+ <message>
+ <source>Restore default toolbars structure</source>
+ <translation>Restaurer la structure des barres d'outils par défaut</translation>
+ </message>
+ <message>
+ <source>Create toolbar</source>
+ <translation>Créer une barre d'outils</translation>
+ </message>
+ <message>
+ <source>Name of a new toolbar</source>
+ <translation>Nom d'une nouvelle barre d'outils</translation>
+ </message>
+ <message>
+ <source>A tool bar with name %1 already exists</source>
+ <translation>Une barre d'outils portant le nom %1 existe déjà</translation>
+ </message>
+ <message>
+ <source>Toolbar %1 will be deleted. Continue?</source>
+ <translation>La barre d'outils %1 sera supprimée. Continuez ?</translation>
+ </message>
+ <message>
+ <source>Delete toolbar</source>
+ <translation>Supprimer la barre d'outils</translation>
+ </message>
+ <message>
+ <source> (%1 commands)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
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>();
}
aMiddlePoint = middlePointOnArc(aFeature);
else if (aFeatureKind == SketchPlugin_Ellipse::ID())
aMiddlePoint = pointOnEllipse(aFeature);
+ else if (aFeatureKind == SketchPlugin_EllipticArc::ID())
+ aMiddlePoint = pointOnEllipse(aFeature, false);
}
return aMiddlePoint;
}
SET(TEXT_RESOURCES
SketchPlugin_msg_en.ts
+ SketchPlugin_msg_fr.ts
)
SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES})
TestProjectionIntoResult.py
TestProjectionUpdate.py
TestRectangle.py
+ TestRemainingDoF.py
TestRemoveEllipse.py
TestRemoveEllipticArc.py
TestRemoveSketch.py
TestMoveArc.py
TestMoveCircle.py
TestMoveEllipse.py
+ TestMoveEllipticArc.py
TestMoveLine.py
TestMovementComplex.py
TestMovePoint.py
#include "SketchPlugin_ConstraintAngle.h"
#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Tools.h>
#include <SketcherPrs_Tools.h>
#include <ModelAPI_AttributeDouble.h>
AISObjectPtr anAIS = SketcherPrs_Factory::angleConstraint(this, sketch(),
thePrevious);
+ if (anAIS.get() && !thePrevious.get())
+ SketchPlugin_Tools::setDimensionColor(anAIS);
return anAIS;
}
#include <SketchPlugin_Point.h>
#include <SketchPlugin_Circle.h>
#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Tools.h>
#include <SketcherPrs_Tools.h>
#include <SketcherPrs_Factory.h>
AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this,
sketch(),
thePrevious);
+ if (anAIS.get() && !thePrevious.get())
+ SketchPlugin_Tools::setDimensionColor(anAIS);
return anAIS;
}
// Author: Artem ZHIDKOV
#include <SketchPlugin_ConstraintDistanceAlongDir.h>
+#include <SketchPlugin_Tools.h>
#include <SketcherPrs_Tools.h>
#include <SketcherPrs_Factory.h>
AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this,
sketch(),
thePrevious);
+ if (anAIS.get() && !thePrevious.get())
+ SketchPlugin_Tools::setDimensionColor(anAIS);
return anAIS;
}
#include "SketchPlugin_ConstraintLength.h"
#include <SketchPlugin_Line.h>
+#include <SketchPlugin_Tools.h>
#include <GeomDataAPI_Point2D.h>
AISObjectPtr anAIS = SketcherPrs_Factory::lengthDimensionConstraint(this,
sketch(), thePrevious);
+ if (anAIS.get() && !thePrevious.get())
+ SketchPlugin_Tools::setDimensionColor(anAIS);
return anAIS;
}
#include <SketchPlugin_Arc.h>
#include <SketchPlugin_Circle.h>
#include <SketchPlugin_Point.h>
+#include <SketchPlugin_Tools.h>
#include <SketcherPrs_Factory.h>
#include <SketcherPrs_Tools.h>
AISObjectPtr anAIS = SketcherPrs_Factory::radiusConstraint(this, sketch(),
thePrevious);
+ if (anAIS.get() && !thePrevious.get())
+ SketchPlugin_Tools::setDimensionColor(anAIS);
return anAIS;
}
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;
}
anAIS.reset(new GeomAPI_AISObject());
}
anAIS->createShape(aCompound);
+ SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
return anAIS;
}
anAIS.reset(new GeomAPI_AISObject());
}
anAIS->createShape(aCompound);
+
+ // Modify attributes
+ SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
+
return anAIS;
}
if (!anAIS)
anAIS.reset(new GeomAPI_AISObject());
anAIS->createShape(aCompound);
+
+ // Modify attributes
+ SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
+
return anAIS;
}
if (!anAIS)
anAIS.reset(new GeomAPI_AISObject());
anAIS->createShape(aCompound);
+ SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value());
return anAIS;
}
"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",
#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>
static const double tolerance = 1.e-7;
+
SketchPlugin_Projection::SketchPlugin_Projection()
: SketchPlugin_SketchEntity(),
myIsComputing(false)
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);
}
}
}
* \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
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.
* 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
}
/// 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
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:
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
#include <ModelAPI_Attribute.h>
#include <ModelAPI_AttributeRefAttr.h>
#include <GeomAPI_Shape.h>
+#include <GeomAPI_AISObject.h>
#include <GeomDataAPI_Point2D.h>
#include <GeomAlgoAPI_ShapeTools.h>
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
--- /dev/null
+<?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'esquisse</translation>
+ </message>
+ </context>
+ <context>
+ <name>Sketch:DirX</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>Sélectionnez un plan pour l'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'attribut peut être utilisée pour la face d'esquisse, pas %1</translation>
+ </message>
+ </context>
+ <context>
+ <name>Sketch:External:GeomValidators_Face</name>
+ <message>
+ <source>The shape is not a face.</source>
+ <translation>L'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'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'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'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'esquisse</translation>
+ </message>
+ </context>
+ <context>
+ <name>Sketch:Features</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>Les objets d'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'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'attribut "%1" 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'attribut "%1" 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'attribut "%1" 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'attribut "%1" 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'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'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'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'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'argument de contrainte ne contient pas d'élément avec un type de forme acceptable. Le type devrait être l'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'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'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'argument de contrainte de type %1 n'est pas pris en charge</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintHorizontal:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'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'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'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'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'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 "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintPerpendicular:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'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'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'est pas sélectionné</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintRadius:ConstraintEntityA</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>Le cercle n'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'attribut "%1" 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'objet n'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'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'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'argument de cercle est "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintRadius:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'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'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'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'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'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'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'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'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'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'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'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'attribut "%1" n'est pas initialisé.</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchRectangle:RectStartPoint</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'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'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'arc tangent n'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'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'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'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'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'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'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'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'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'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'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'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'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'angle n'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'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'objets pivotés n'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'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'objets pivotés n'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'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'attribut avec le type %1 n'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'objet %1 est le résultat d'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 "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchMultiRotation:MultiRotationCenter:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'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'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'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'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'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'objets traduits n'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'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'objets traduits n'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'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'attribut avec le type %1 n'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'objet %1 est le résultat d'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 "%1", il doit correspondre à "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchMultiTranslation:MultiTranslationStartPoint:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'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'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 "%1", il doit correspondre à "%2".</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchMultiTranslation:MultiTranslationEndPoint:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'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'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'attribut "%1" 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'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'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'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'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'objet est "%1", il devrait correspondre à "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintAngle:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'objet est "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintAngle:ConstraintEntityB:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'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'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'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'attribut "%1" 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'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'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'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'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'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'objet est "%1", il devrait correspondre à "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintDistance:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'objet est "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintDistance:ConstraintEntityB:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'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'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'attribut "%1" 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'objet n'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'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'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 "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintLength:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'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'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'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'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'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'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'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 "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintParallel:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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 "%1", il devrait être "%2"</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+ <message>
+ <source>The attribute with the %1 type is not processed</source>
+ <translation>L'attribut avec le type %1 n'est pas traité</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintParallel:ConstraintEntityB:GeomValidators_ShapeType</name>
+ <message>
+ <source>The result is empty</source>
+ <translation>L'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'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'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'est pas sélectionné</translation>
+ </message>
+ </context>
+
+ <context>
+ <name>SketchConstraintRigid:ConstraintEntityA:GeomValidators_ShapeType</name>
+ <message>
+ <source>The object is empty</source>
+ <translation>L'objet n'est pas sélectionné</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintRigid:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'objet n'est pas sélectionné</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintRigid:ConstraintEntityA</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'objet n'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'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'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'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'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'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'attribut peut être utilisée pour la face d'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'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'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'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'a pas d'esquisse</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchProjection:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'est pas initialisé.</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchProjection:ExternalFeature</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'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'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'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'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'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'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'objet est vide</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchConstraintCollinear:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'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'orientation de la distance</translation>
+ </message>
+ <message>
+ <source>Keep orientation</source>
+ <translation>Gardez l'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'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'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'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'attribut "%1" n'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'attribut "%1" 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'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'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'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'attribut "%1" n'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'attribut "%1" 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'un arc et d'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'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'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'un cercle ou d'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'attribut "%1" n'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'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'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'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'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'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'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'esquisse</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchIntersectionPoint:Model_FeatureValidator</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'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'attribut "%1" n'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'attribut "%1" n'est pas initialisé.</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchMacroArc:angle</name>
+ <message>
+ <source>Set angle</source>
+ <translation>Définir l'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'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'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'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'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'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'attribut "%1" n'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'attribut "%1" n'est pas initialisé.</translation>
+ </message>
+ </context>
+ <context>
+ <name>SketchMacroArc:start_point_2</name>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'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'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'attribut "%1" est verrouillé par la valeur de modification dans la vue.</translation>
+ </message>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>L'attribut "%1" n'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'attribut "%1" 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'attribut "%1" 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'attribut "%1" n'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'attribut "%1" n'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'attribut "%1" n'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'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'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'attribut "%1" n'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'arrivée.</translation>
+ </message>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>Sélectionnez un point d'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'axe majeur.</translation>
+ </message>
+ <message>
+ <source>Attribute "%1" is not initialized.</source>
+ <translation>Sélectionnez un point d'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'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'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'attribut "%1" 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'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'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'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'est pas pris en charge</translation>
+ </message>
+ <message>
+ <source>The attribute %1 should be an edge or vertex</source>
+ <translation>L'é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'a pas d'esquisse</translation>
+ </message>
+ <message>
+ <source>Unable to project feature from the same sketch</source>
+ <translation>Les fonctions de l'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'esquisse.</translation>
+ </message>
+ <message>
+ <source>Error: Circle is orthogonal to the sketch plane.</source>
+ <translation>Erreur : Le cercle est orthogonal au plan d'esquisse.</translation>
+ </message>
+ <message>
+ <source>Error: Arc is orthogonal to the sketch plane.</source>
+ <translation>Erreur : L'arc est orthogonal au plan d'esquisse.</translation>
+ </message>
+ <message>
+ <source>Error: Ellipse is orthogonal to the sketch plane.</source>
+ <translation>Erreur : L’ellipse est orthogonal au plan d'esquisse.</translation>
+ </message>
+ <message>
+ <source>Error: Elliptic Arc is orthogonal to the sketch plane.</source>
+ <translation>Erreur : L'arc elliptique est orthogonal au plan d'esquisse.</translation>
+ </message>
+ <message>
+ <source>Error: Selected object is not supported for projection.</source>
+ <translation>Erreur : L'objet sélectionné n'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'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'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'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'arc ou le cercle du segment sélectionné sur les points d'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'attribut "%1" n'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>
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()
--- /dev/null
+# 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"
from ConfigAPI import *
Config_PropManager().registerProp("Visualization", "dimension_value_size", "Dimension value size", Config_Prop.IntSpin, "16")
+Config_PropManager().registerProp("Visualization", "sketch_dimension_color", "Dimension color", Config_Prop.Color, "64,128,255")
model.begin()
partSet = model.moduleDocument()
--- /dev/null
+# 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)
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 -->
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>
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>
SET(SKETCHSOLVER_TEXT_RESOURCES
SketchSolver_msg_en.ts
+ SketchSolver_msg_fr.ts
)
INCLUDE_DIRECTORIES(
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;
{
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());
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;
/// \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();
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
}
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);
+ }
+}
/// 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,
return false;
return true;
}
+
+void SketchSolver_Group::underconstrainedFeatures(std::set<ObjectPtr>& theFeatures) const
+{
+ myStorage->getUnderconstrainedGeometry(theFeatures);
+}
*/
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);
////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()
}
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();
// 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
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;
}
* \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
/// \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.
--- /dev/null
+<?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'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'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>
XGUI_ActiveControlSelector.h
XGUI_ColorDialog.h
XGUI_ContextMenuMgr.h
- XGUI_CustomPrs.h
XGUI_DataModel.h
XGUI_DeflectionDialog.h
XGUI_Displayer.h
XGUI_ActiveControlMgr.cpp
XGUI_ColorDialog.cpp
XGUI_ContextMenuMgr.cpp
- XGUI_CustomPrs.cpp
XGUI_DataModel.cpp
XGUI_DeflectionDialog.cpp
XGUI_Displayer.cpp
)
SET(TEXT_RESOURCES
-# XGUI_msg_fr.ts
+ XGUI_msg_fr.ts
)
SET(PROJECT_LIBRARIES
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
+ OPTIONS -extensions cpp -no-recursive -locations none
)
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})
+++ /dev/null
-// 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;
-}
+++ /dev/null
-// 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
#include "XGUI_Displayer.h"
-#include "XGUI_CustomPrs.h"
#include "XGUI_FacesPanel.h"
#include "XGUI_Selection.h"
#include "XGUI_SelectionActivate.h"
#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>
: myWorkshop(theWorkshop), myNeedUpdate(false),
myViewerBlockedRecursiveCount(0), myIsFirstAISContextUse(true)
{
- myCustomPrs = std::shared_ptr<GeomAPI_ICustomPrs>(new XGUI_CustomPrs(theWorkshop));
}
//**************************************************************
}
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;
if (!anAISIO.IsNull()) {
appendResultObject(theObject, theAIS);
- bool isCustomized = customizeObject(theObject);
+ //bool isCustomized = customizeObject(theObject);
int aDispMode = isShading? Shading : Wireframe;
if (isShading)
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) {
}
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
// 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;
}
}
//**************************************************************
-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,
#include "XGUI.h"
#include <GeomAPI_AISObject.h>
-#include <GeomAPI_ICustomPrs.h>
#include <GeomAPI_Pln.h>
#include <ModelAPI_Result.h>
#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
#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>
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))
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
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
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;
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));
// 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);
//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));
}
}
- bool isCustomized = customizeCurrentObject(anObjects, aDisplayed);
+ bool isCustomized = customizeFeature(anObjects, aDisplayed);
//if (myObjectBrowser)
// myObjectBrowser->processEvent(theMsg);
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();
// 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;
}
}
/// 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;
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Move to the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SHAPER files (*.shaper *.cadbld)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SHAPER files (*.shaper)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CAD Builder files (*.cadbld);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>CAD Builder files (*.cadbld)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Name %2 already exists in %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Abort operation</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Validate operation</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_ActionsMgr</name>
+ <message>
+ <source>Shortcut %1 is already defined. Ignore.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Apply and continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Help</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>See preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Compute preview</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_ColorDialog</name>
+ <message>
+ <source>Color</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Random</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_ContextMenuMgr</name>
+ <message>
+ <source>Delete</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clean history</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Color...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Deflection...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transparency...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show only</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Hide all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shading</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wireframe</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Vertices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Faces</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Results</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select results</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select parent feature</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TInspector</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Insert a folder before</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move into the previous folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move into the next folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move out before the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Move out after the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set view by inverted normal to face</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set view by normal to face</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selection mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_DataTree</name>
+ <message>
+ <source>History change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_DeflectionDialog</name>
+ <message>
+ <source>Deflection</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_ErrorDialog</name>
+ <message>
+ <source>Application errors</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_ErrorMgr</name>
+ <message>
+ <source>Errors:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_FacesPanel</name>
+ <message>
+ <source>Hide Faces</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transparent</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_InspectionPanel</name>
+ <message>
+ <source>Inspection Panel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Object</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sub-shapes</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Number</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SHAPE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>COMPOUND</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>COMPSOLID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SOLID</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>SHELL</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>FACE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>WIRE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EDGE</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>VERTEX</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Vertex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Coordinates</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Degenerated</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Line segment</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Center</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Dimensions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Radius</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Major radius</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minor radius</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>End point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Closed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Polygon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Point</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Wire</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rectangle</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Corner</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Width</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Height</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Plane</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Sphere</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cylinder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Cone</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Torus</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Face</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Box</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Rotated Box</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shell</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Solid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bounding box</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimal corner</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Maximal corner</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Origin</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Position</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Axis</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Radius 1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Radius 2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Depth</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Z axis</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>X axis</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_ObjectsBrowser</name>
+ <message>
+ <source>Part set</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_OperationMgr</name>
+ <message>
+ <source>All active operations will be aborted.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Please validate all your active operations before saving.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%1 operation will be aborted.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Please validate your %1 before saving.</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_PropertyPanel</name>
+ <message>
+ <source>Property Panel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_TransparencyWidget</name>
+ <message>
+ <source>Opaque</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transparent</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>XGUI_Workshop</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Undo last command</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>INF_DESK_TOOLBAR_STANDARD</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Redo last command</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Export native...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Export the current document into a native file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Import native...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Import native file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save as...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save the document into a file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open a new document</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Auto rebuild</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Blocks immediate apply of modifications</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Edit preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exit</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Exit application</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save current file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The document is modified, save before opening another?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Open file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to open the file.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The document is modified, save before exit?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Select name to save file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Information about module "%1" doesn't exist.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Object browser</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show object</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>'%1'
+ are hidden by %2:
+Remove objects from the panel to be displayed?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>All features are relevant, there is nothing to be deleted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Transparency</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Find results</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Results not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>