diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index 4976a9d18a8b..595ce664da26 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -1633,11 +1633,11 @@ void SketchObject::getGeoVertexIndex(int VertexId, int &GeoId, PointPos &PosId) int SketchObject::getVertexIndexGeoPos(int GeoId, PointPos PosId) const { - - for(int i=0;i &SubNames = selection[0].getSubNames(); Sketcher::SketchObject* Obj = dynamic_cast(selection[0].getObject()); const std::vector< Sketcher::Constraint * > &vals = Obj->Constraints.getValues(); - + if (SubNames.size() < 2) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), QObject::tr("Select two or more vertexes from the sketch.")); @@ -552,33 +552,39 @@ void CmdSketcherConstrainCoincident::activated(int iMsg) getIdsFromName(SubNames[0], Obj, GeoId1, PosId1); // undo command open + bool constraintsAdded = false; openCommand("add coincident constraint"); for (std::size_t i=1; i::const_iterator it= vals.begin(); - it != vals.end(); ++it) { - if ( (*it)->Type == Sketcher::Coincident && - ( (*it)->First == GeoId1 && (*it)->FirstPos == PosId1 && - (*it)->Second == GeoId2 && (*it)->SecondPos == PosId2 ) || - ( (*it)->First == GeoId2 && (*it)->FirstPos == PosId2 && - (*it)->Second == GeoId1 && (*it)->SecondPos == PosId1 ) ) { - constraintExists=true; - break; - } - } - - if (!constraintExists) - Gui::Command::doCommand( - Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", - selection[0].getFeatName(),GeoId1,PosId1,GeoId2,PosId2); + + // check if any of the coincident constraints exist + bool constraintExists=false; + + for (std::vector< Sketcher::Constraint * >::const_iterator it= vals.begin(); it != vals.end(); ++it) { + if ((*it)->Type == Sketcher::Coincident && + ( (*it)->First == GeoId1 && (*it)->FirstPos == PosId1 && + (*it)->Second == GeoId2 && (*it)->SecondPos == PosId2 ) || + ( (*it)->First == GeoId2 && (*it)->FirstPos == PosId2 && + (*it)->Second == GeoId1 && (*it)->SecondPos == PosId1 ) ) { + constraintExists=true; + break; + } + } + + if (!constraintExists) { + constraintsAdded = true; + Gui::Command::doCommand( + Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", + selection[0].getFeatName(),GeoId1,PosId1,GeoId2,PosId2); + } } - // finish the transaction and update - commitCommand(); + // finish or abort the transaction and update + if (constraintsAdded) + commitCommand(); + else + abortCommand(); + updateActive(); // clear the selection (convenience) diff --git a/src/Mod/Sketcher/Gui/CommandSketcherAccel.cpp b/src/Mod/Sketcher/Gui/CommandSketcherAccel.cpp index a85a028ea249..e979ef7022b7 100644 --- a/src/Mod/Sketcher/Gui/CommandSketcherAccel.cpp +++ b/src/Mod/Sketcher/Gui/CommandSketcherAccel.cpp @@ -47,18 +47,19 @@ using namespace Sketcher; bool isSketcherAcceleratorActive(Gui::Document *doc, bool actsOnSelection ) { - if (doc) + if (doc) { // checks if a Sketch Viewprovider is in Edit and is in no special mode - if (doc->getInEdit() && doc->getInEdit()->isDerivedFrom(SketcherGui::ViewProviderSketch::getClassTypeId())) + if (doc->getInEdit() && doc->getInEdit()->isDerivedFrom(SketcherGui::ViewProviderSketch::getClassTypeId())) { if (dynamic_cast(doc->getInEdit()) - ->getSketchMode() == ViewProviderSketch::STATUS_NONE) + ->getSketchMode() == ViewProviderSketch::STATUS_NONE) { if (!actsOnSelection) - return true; - else{ - if(Gui::Selection().countObjectsOfType(Sketcher::SketchObject::getClassTypeId()) > 0) - return true; - } - + return true; + else if (Gui::Selection().countObjectsOfType(Sketcher::SketchObject::getClassTypeId()) > 0) + return true; + } + } + } + return false; } @@ -87,62 +88,61 @@ void CmdSketcherCloseShape::activated(int iMsg) // only one sketch with its subelements are allowed to be selected if (selection.size() != 1) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select an edge from the sketch.")); + QObject::tr("Select at least two edges from the sketch.")); return; } // get the needed lists and objects const std::vector &SubNames = selection[0].getSubNames(); + if (SubNames.size() < 2) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), + QObject::tr("Select at least two edges from the sketch.")); + return; + } Sketcher::SketchObject* Obj = dynamic_cast(selection[0].getObject()); int GeoIdFirst=-1; int GeoIdLast=-1; + // undo command open + openCommand("add coincident constraint"); // go through the selected subelements for (unsigned int i=0; i<(SubNames.size()-1); i++ ) { // only handle edges if (SubNames[i].size() > 4 && SubNames[i].substr(0,4) == "Edge" && - SubNames[i+1].size() > 4 && SubNames[i+1].substr(0,4) == "Edge" ) { - - int GeoId1 = std::atoi(SubNames[i].substr(4,4000).c_str()) - 1; - int GeoId2 = std::atoi(SubNames[i+1].substr(4,4000).c_str()) - 1; - - if(GeoIdFirst==-1) - GeoIdFirst=GeoId1; - - GeoIdLast=GeoId2; - - const Part::Geometry *geo1 = Obj->getGeometry(GeoId1); - const Part::Geometry *geo2 = Obj->getGeometry(GeoId2); - if ( (geo1->getTypeId() != Part::GeomLineSegment::getClassTypeId() && - geo1->getTypeId() != Part::GeomArcOfCircle::getClassTypeId() ) || - (geo2->getTypeId() != Part::GeomLineSegment::getClassTypeId() && - geo2->getTypeId() != Part::GeomArcOfCircle::getClassTypeId()) ) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Impossible constraint"), - QObject::tr("One selected edge is not connectable")); - return; - } - - // undo command open - openCommand("add coincident constraint"); - Gui::Command::doCommand( - Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", - selection[0].getFeatName(),GeoId1,Sketcher::end,GeoId2,Sketcher::start); - - // finish the transaction and update - commitCommand(); - + SubNames[i+1].size() > 4 && SubNames[i+1].substr(0,4) == "Edge" ) { + + int GeoId1 = std::atoi(SubNames[i].substr(4,4000).c_str()) - 1; + int GeoId2 = std::atoi(SubNames[i+1].substr(4,4000).c_str()) - 1; + + if(GeoIdFirst==-1) + GeoIdFirst=GeoId1; + + GeoIdLast=GeoId2; + + const Part::Geometry *geo1 = Obj->getGeometry(GeoId1); + const Part::Geometry *geo2 = Obj->getGeometry(GeoId2); + if ((geo1->getTypeId() != Part::GeomLineSegment::getClassTypeId() && + geo1->getTypeId() != Part::GeomArcOfCircle::getClassTypeId() ) || + (geo2->getTypeId() != Part::GeomLineSegment::getClassTypeId() && + geo2->getTypeId() != Part::GeomArcOfCircle::getClassTypeId()) ) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Impossible constraint"), + QObject::tr("One selected edge is not connectable")); + abortCommand(); + return; + } + Gui::Command::doCommand( + Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", + selection[0].getFeatName(),GeoId1,Sketcher::end,GeoId2,Sketcher::start); } } - + // Close Last Edge with First Edge - // undo command open - openCommand("add coincident constraint"); Gui::Command::doCommand( - Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", - selection[0].getFeatName(),GeoIdLast,Sketcher::end,GeoIdFirst,Sketcher::start); - + Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", + selection[0].getFeatName(),GeoIdLast,Sketcher::end,GeoIdFirst,Sketcher::start); + // finish the transaction and update commitCommand(); @@ -183,47 +183,51 @@ void CmdSketcherConnect::activated(int iMsg) // only one sketch with its subelements are allowed to be selected if (selection.size() != 1) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select an edge from the sketch.")); + QObject::tr("Select at least two edges from the sketch.")); return; } // get the needed lists and objects const std::vector &SubNames = selection[0].getSubNames(); + if (SubNames.size() < 2) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), + QObject::tr("Select at least two edges from the sketch.")); + return; + } Sketcher::SketchObject* Obj = dynamic_cast(selection[0].getObject()); - + + // undo command open + openCommand("add coincident constraint"); + // go through the selected subelements for (unsigned int i=0; i<(SubNames.size()-1); i++ ) { // only handle edges if (SubNames[i].size() > 4 && SubNames[i].substr(0,4) == "Edge" && - SubNames[i+1].size() > 4 && SubNames[i+1].substr(0,4) == "Edge" ) { - - int GeoId1 = std::atoi(SubNames[i].substr(4,4000).c_str()) - 1; - int GeoId2 = std::atoi(SubNames[i+1].substr(4,4000).c_str()) - 1; - - const Part::Geometry *geo1 = Obj->getGeometry(GeoId1); - const Part::Geometry *geo2 = Obj->getGeometry(GeoId2); - if ( (geo1->getTypeId() != Part::GeomLineSegment::getClassTypeId() && - geo1->getTypeId() != Part::GeomArcOfCircle::getClassTypeId() ) || - (geo2->getTypeId() != Part::GeomLineSegment::getClassTypeId() && - geo2->getTypeId() != Part::GeomArcOfCircle::getClassTypeId()) ) { - QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Impossible constraint"), - QObject::tr("One selected edge is not connectable")); - return; - } - - // undo command open - openCommand("add coincident constraint"); - Gui::Command::doCommand( - Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", - selection[0].getFeatName(),GeoId1,Sketcher::end,GeoId2,Sketcher::start); - - // finish the transaction and update - commitCommand(); - + SubNames[i+1].size() > 4 && SubNames[i+1].substr(0,4) == "Edge" ) { + + int GeoId1 = std::atoi(SubNames[i].substr(4,4000).c_str()) - 1; + int GeoId2 = std::atoi(SubNames[i+1].substr(4,4000).c_str()) - 1; + + const Part::Geometry *geo1 = Obj->getGeometry(GeoId1); + const Part::Geometry *geo2 = Obj->getGeometry(GeoId2); + if ((geo1->getTypeId() != Part::GeomLineSegment::getClassTypeId() && + geo1->getTypeId() != Part::GeomArcOfCircle::getClassTypeId()) || + (geo2->getTypeId() != Part::GeomLineSegment::getClassTypeId() && + geo2->getTypeId() != Part::GeomArcOfCircle::getClassTypeId())) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Impossible constraint"), + QObject::tr("One selected edge is not connectable")); + abortCommand(); + return; + } + Gui::Command::doCommand( + Doc,"App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%d,%d,%d,%d)) ", + selection[0].getFeatName(),GeoId1,Sketcher::end,GeoId2,Sketcher::start); } } + // finish the transaction and update + commitCommand(); updateActive(); // clear the selection (convenience) @@ -282,18 +286,17 @@ void CmdSketcherSelectConstraints::activated(int iMsg) int GeoId = std::atoi(it->substr(4,4000).c_str()) - 1; // push all the constraints - int i=1; + int i=1; for (std::vector< Sketcher::Constraint * >::const_iterator it= vals.begin(); it != vals.end(); ++it,++i) { if ( (*it)->First == GeoId || (*it)->Second == GeoId || (*it)->Third == GeoId){ - ss.str(std::string()); - ss << "Constraint" << i; - Gui::Selection().addSelection(doc_name.c_str(), obj_name.c_str(), ss.str().c_str()); - } + ss.str(std::string()); + ss << "Constraint" << i; + Gui::Selection().addSelection(doc_name.c_str(), obj_name.c_str(), ss.str().c_str()); + } } } } - } bool CmdSketcherSelectConstraints::isActive(void) diff --git a/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc b/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc index 15622270530a..56dc1de0eb9c 100644 --- a/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc +++ b/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc @@ -1,141 +1,141 @@ - - icons/Constraint_TangentToStart.svg - icons/Sketcher_CreateFillet.svg - icons/Sketcher_CreateLine.svg - icons/Sketcher_SelectConstraints.svg - icons/Sketcher_CreateArc.svg - icons/Sketcher_CreateCircle.svg - icons/Sketcher_CreateSlot.svg - icons/Sketcher_CloseShape.svg - icons/Constraint_PointOnPoint.svg - icons/Sketcher_Sketch.svg - icons/Sketcher_Element_Circle_Edge.svg - icons/Sketcher_Element_Line_EndPoint.svg - icons/Sketcher_DraftLine.svg - icons/Sketcher_External.svg - icons/Sketcher_Element_Line_StartingPoint.svg - icons/Sketcher_ConstrainDistance.svg - icons/Sketcher_LeaveSketch.svg - icons/Sketcher_AlterFillet.svg - icons/Sketcher_CreateHexagon.svg - icons/Sketcher_Create3PointArc.svg - icons/Sketcher_SelectHorizontalAxis.svg - icons/Sketcher_ConstrainParallel.svg - icons/Sketcher_ConnectLines.svg - icons/Sketcher_SelectVerticalAxis.svg - icons/Sketcher_Element_Arc_MidPoint.svg - icons/Constraint_Parallel.svg - icons/Constraint_Concentric.svg - icons/Sketcher_ProfilesHexagon1.svg - icons/Sketcher_ConstrainHorizontal.svg - icons/Constraint_InternalAngle.svg - icons/Constraint_PointOnStart.svg - icons/Sketcher_ConstrainCoincident.svg - icons/Constraint_PointOnEnd.svg - icons/Sketcher_CreateText.svg - icons/Sketcher_Element_Circle_MidPoint.svg - icons/Sketcher_MapSketch.svg - icons/Constraint_PointOnObject.svg - icons/Constraint_PointOnMidPoint.svg - icons/Sketcher_NewSketch.svg - icons/Sketcher_ConstrainLock.svg - icons/Constraint_Perpendicular.svg - icons/Constraint_Symmetric.svg - icons/Constraint_PointToObject.svg - icons/Sketcher_CreateHeptagon.svg - icons/Sketcher_Trimming.svg - icons/Sketcher_Element_Arc_Edge.svg - icons/Sketcher_CreateTriangle.svg - icons/Sketcher_Element_Arc_StartingPoint.svg - icons/Sketcher_Element_Line_Edge.svg - icons/Constraint_EqualLength.svg - icons/Sketcher_CreateRectangle.svg - icons/Constraint_ExternalAngle.svg - icons/Constraint_Length.svg - icons/Sketcher_EditSketch.svg - icons/Constraint_Vertical.svg - icons/Constraint_TangentToEnd.svg - icons/Constraint_VerticalDistance.svg - icons/Sketcher_CreateOctagon.svg - icons/Sketcher_CreatePoint.svg - icons/Constraint_Horizontal.svg - icons/Sketcher_CreatePentagon.svg - icons/Sketcher_ConstrainVertical.svg - icons/Sketcher_Element_Arc_EndPoint.svg - icons/Sketcher_AlterConstruction.svg - icons/Constraint_HorizontalDistance.svg - icons/Sketcher_CreateSquare.svg - icons/Constraint_Radius.svg - icons/Sketcher_ViewSketch.svg - icons/Sketcher_Element_Point_StartingPoint.svg - icons/Sketcher_Create3PointCircle.svg - icons/Sketcher_SelectOrigin.svg - icons/Sketcher_Element_SelectionTypeInvalid.svg - icons/Constraint_Tangent.svg - icons/Sketcher_CreatePolyline.svg + + icons/small/Constraint_Concentric_sm.xpm + icons/small/Constraint_EqualLength_sm.xpm + icons/small/Constraint_ExternalAngle_sm.xpm + icons/small/Constraint_Horizontal_sm.xpm + icons/small/Constraint_InternalAngle_sm.xpm + icons/small/Constraint_Length_sm.xpm + icons/small/Constraint_Lock_sm.xpm + icons/small/Constraint_Parallel_sm.xpm + icons/small/Constraint_Perpendicular_sm.xpm + icons/small/Constraint_PointOnEnd_sm.xpm + icons/small/Constraint_PointOnMidPoint_sm.xpm + icons/small/Constraint_PointOnObject_sm.xpm + icons/small/Constraint_PointOnPoint_sm.xpm + icons/small/Constraint_PointOnStart_sm.xpm + icons/small/Constraint_PointToObject_sm.xpm icons/small/Constraint_Radius_sm.xpm + icons/small/Constraint_Tangent_sm.xpm + icons/small/Constraint_TangentToEnd_sm.xpm + icons/small/Constraint_TangentToStart_sm.xpm + icons/small/Constraint_Vertical_sm.xpm icons/small/Constraint_HorizontalDistance_sm.xpm - icons/small/Constraint_PointOnEnd_sm.xpm + icons/small/Constraint_VerticalDistance_sm.xpm + icons/small/Constraint_Symmetric_sm.xpm icons/small/Sketcher_Element_Line_EndPoint_sm.xpm icons/small/Sketcher_ConnectLines.xpm - icons/small/Constraint_PointToObject_sm.xpm icons/small/Sketcher_Element_Arc_Edge_sm.xpm icons/small/Sketcher_SelectHorizontalAxis.xpm icons/small/Sketcher_Element_Line_Edge_sm.xpm - icons/small/Constraint_Parallel_sm.xpm - icons/small/Constraint_InternalAngle_sm.xpm icons/small/Sketcher_Element_Arc_EndPoint_sm.xpm - icons/small/Constraint_PointOnPoint_sm.xpm icons/small/Sketcher_SelectVerticalAxis.xpm - icons/small/Constraint_VerticalDistance_sm.xpm - icons/small/Constraint_Length_sm.xpm - icons/small/Constraint_PointOnStart_sm.xpm - icons/small/Constraint_PointOnObject_sm.xpm icons/small/Sketcher_Element_SelectionTypeInvalid_sm.xpm - icons/small/Constraint_Concentric_sm.xpm - icons/small/Constraint_Perpendicular_sm.xpm - icons/small/Constraint_PointOnMidPoint_sm.xpm - icons/small/Constraint_Lock_sm.xpm - icons/small/Constraint_ExternalAngle_sm.xpm icons/small/Sketcher_CloseShape.xpm icons/small/Sketcher_Element_Point_StartingPoint_sm.xpm - icons/small/Constraint_Horizontal_sm.xpm icons/small/Sketcher_Element_Circle_MidPoint_sm.xpm - icons/small/Constraint_TangentToStart_sm.xpm icons/small/Sketcher_Element_Arc_StartingPoint_sm.xpm - icons/small/Constraint_EqualLength_sm.xpm icons/small/Sketcher_SelectOrigin.xpm icons/small/Sketcher_Element_Circle_Edge_sm.xpm - icons/small/Constraint_TangentToEnd_sm.xpm - icons/small/Constraint_Symmetric_sm.xpm icons/small/Sketcher_Element_Arc_MidPoint_sm.xpm icons/small/Sketcher_SelectConstraints.xpm icons/small/Sketcher_Element_Line_StartingPoint_sm.xpm - icons/small/Constraint_Vertical_sm.xpm - icons/small/Constraint_Tangent_sm.xpm - translations/Sketcher_es-ES.qm - translations/Sketcher_nl.qm - translations/Sketcher_uk.qm - translations/Sketcher_sv-SE.qm + icons/Constraint_Concentric.svg + icons/Constraint_EqualLength.svg + icons/Constraint_ExternalAngle.svg + icons/Constraint_Horizontal.svg + icons/Constraint_InternalAngle.svg + icons/Constraint_Length.svg + icons/Constraint_Parallel.svg + icons/Constraint_Perpendicular.svg + icons/Constraint_PointOnEnd.svg + icons/Constraint_PointOnMidPoint.svg + icons/Constraint_PointOnObject.svg + icons/Constraint_PointOnPoint.svg + icons/Constraint_PointOnStart.svg + icons/Constraint_PointToObject.svg + icons/Constraint_Radius.svg + icons/Constraint_Tangent.svg + icons/Constraint_TangentToEnd.svg + icons/Constraint_TangentToStart.svg + icons/Constraint_Vertical.svg + icons/Constraint_HorizontalDistance.svg + icons/Constraint_VerticalDistance.svg + icons/Constraint_Symmetric.svg + icons/Sketcher_ConstrainCoincident.svg + icons/Sketcher_ConstrainDistance.svg + icons/Sketcher_ConstrainHorizontal.svg + icons/Sketcher_ConstrainLock.svg + icons/Sketcher_ConstrainParallel.svg + icons/Sketcher_ConstrainVertical.svg + icons/Sketcher_CreateArc.svg + icons/Sketcher_Create3PointArc.svg + icons/Sketcher_CreateCircle.svg + icons/Sketcher_Create3PointCircle.svg + icons/Sketcher_CreateLine.svg + icons/Sketcher_CreatePoint.svg + icons/Sketcher_CreatePolyline.svg + icons/Sketcher_CreateRectangle.svg + icons/Sketcher_CreateSlot.svg + icons/Sketcher_CreateFillet.svg + icons/Sketcher_CreateTriangle.svg + icons/Sketcher_CreateSquare.svg + icons/Sketcher_CreatePentagon.svg + icons/Sketcher_CreateHexagon.svg + icons/Sketcher_CreateHeptagon.svg + icons/Sketcher_CreateOctagon.svg + icons/Sketcher_CreateText.svg + icons/Sketcher_DraftLine.svg + icons/Sketcher_Trimming.svg + icons/Sketcher_External.svg + icons/Sketcher_EditSketch.svg + icons/Sketcher_LeaveSketch.svg + icons/Sketcher_MapSketch.svg + icons/Sketcher_NewSketch.svg + icons/Sketcher_Sketch.svg + icons/Sketcher_ViewSketch.svg + icons/Sketcher_AlterConstruction.svg + icons/Sketcher_ProfilesHexagon1.svg + icons/Sketcher_AlterFillet.svg + icons/Sketcher_CloseShape.svg + icons/Sketcher_ConnectLines.svg + icons/Sketcher_Element_Circle_Edge.svg + icons/Sketcher_Element_Line_EndPoint.svg + icons/Sketcher_Element_Line_StartingPoint.svg + icons/Sketcher_Element_Arc_MidPoint.svg + icons/Sketcher_Element_Circle_MidPoint.svg + icons/Sketcher_Element_Arc_Edge.svg + icons/Sketcher_Element_Arc_StartingPoint.svg + icons/Sketcher_Element_Line_Edge.svg + icons/Sketcher_Element_Arc_EndPoint.svg + icons/Sketcher_Element_Point_StartingPoint.svg + icons/Sketcher_SelectOrigin.svg + icons/Sketcher_Element_SelectionTypeInvalid.svg + icons/Sketcher_SelectHorizontalAxis.svg + icons/Sketcher_SelectVerticalAxis.svg + icons/Sketcher_SelectConstraints.svg + translations/Sketcher_af.qm translations/Sketcher_de.qm - translations/Sketcher_it.qm - translations/Sketcher_pl.qm translations/Sketcher_fi.qm - translations/Sketcher_tr.qm - translations/Sketcher_ru.qm translations/Sketcher_fr.qm translations/Sketcher_hr.qm - translations/Sketcher_af.qm + translations/Sketcher_it.qm + translations/Sketcher_nl.qm translations/Sketcher_no.qm + translations/Sketcher_pl.qm + translations/Sketcher_ru.qm + translations/Sketcher_uk.qm + translations/Sketcher_tr.qm + translations/Sketcher_sv-SE.qm translations/Sketcher_zh-TW.qm - translations/Sketcher_zh-CN.qm - translations/Sketcher_ro.qm - translations/Sketcher_ja.qm translations/Sketcher_pt-BR.qm + translations/Sketcher_cs.qm translations/Sketcher_sk.qm + translations/Sketcher_es-ES.qm + translations/Sketcher_zh-CN.qm + translations/Sketcher_ja.qm + translations/Sketcher_ro.qm translations/Sketcher_hu.qm - translations/Sketcher_cs.qm translations/Sketcher_pt-PT.qm