diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index aed45a9f3c..977b608bc5 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -116,6 +116,7 @@ SET(Modifier_tools draftguitools/gui_drawing.py draftguitools/gui_wire2spline.py draftguitools/gui_shape2dview.py + draftguitools/gui_draft2sketch.py ) SET(Draft_GUI_tools diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 292bd37008..928a22981f 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -187,64 +187,7 @@ from draftguitools.gui_scale import Scale from draftguitools.gui_drawing import Drawing from draftguitools.gui_wire2spline import WireToBSpline from draftguitools.gui_shape2dview import Shape2DView - - -class Draft2Sketch(Modifier): - """The Draft2Sketch FreeCAD command definition""" - - def GetResources(self): - return {'Pixmap' : 'Draft_Draft2Sketch', - 'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_Draft2Sketch", "Draft to Sketch"), - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Draft2Sketch", "Convert bidirectionally between Draft and Sketch objects")} - - def Activated(self): - Modifier.Activated(self) - if not FreeCADGui.Selection.getSelection(): - if self.ui: - self.ui.selectUi() - FreeCAD.Console.PrintMessage(translate("draft", "Select an object to convert")+"\n") - self.call = self.view.addEventCallback("SoEvent",selectObject) - else: - self.proceed() - - def proceed(self): - if self.call: - self.view.removeEventCallback("SoEvent",self.call) - sel = FreeCADGui.Selection.getSelection() - allSketches = True - allDraft = True - FreeCADGui.addModule("Draft") - for obj in sel: - if obj.isDerivedFrom("Sketcher::SketchObject"): - allDraft = False - elif obj.isDerivedFrom("Part::Part2DObjectPython"): - allSketches = False - else: - allDraft = False - allSketches = False - if not sel: - return - elif allDraft: - lines = ["Draft.makeSketch(FreeCADGui.Selection.getSelection(),autoconstraints=True)"] - self.commit(translate("draft","Convert to Sketch"), - lines + ['FreeCAD.ActiveDocument.recompute()']) - elif allSketches: - lines = ["Draft.draftify(FreeCAD.ActiveDocument."+o.Name+",delete=False)" for o in sel] - self.commit(translate("draft","Convert to Draft"), - lines + ['FreeCAD.ActiveDocument.recompute()']) - else: - lines = [] - for obj in sel: - if obj.isDerivedFrom("Sketcher::SketchObject"): - lines.append("Draft.draftify(FreeCAD.ActiveDocument."+obj.Name+",delete=False)") - elif obj.isDerivedFrom("Part::Part2DObjectPython"): - lines.append("Draft.makeSketch(FreeCAD.ActiveDocument."+obj.Name+",autoconstraints=True)") - elif obj.isDerivedFrom("Part::Feature"): - #if (len(obj.Shape.Wires) == 1) or (len(obj.Shape.Edges) == 1): - lines.append("Draft.makeSketch(FreeCAD.ActiveDocument."+obj.Name+",autoconstraints=True)") - self.commit(translate("draft","Convert"), - lines + ['FreeCAD.ActiveDocument.recompute()']) - self.finish() +from draftguitools.gui_draft2sketch import Draft2Sketch class Array(Modifier): @@ -582,7 +525,6 @@ from draftguitools.gui_snaps import ShowSnapBar # drawing commands # modification commands -FreeCADGui.addCommand('Draft_Draft2Sketch',Draft2Sketch()) FreeCADGui.addCommand('Draft_Array',Array()) FreeCADGui.addCommand('Draft_LinkArray',LinkArray()) FreeCADGui.addCommand('Draft_Clone',Draft_Clone()) diff --git a/src/Mod/Draft/draftguitools/gui_draft2sketch.py b/src/Mod/Draft/draftguitools/gui_draft2sketch.py new file mode 100644 index 0000000000..cd1de30d20 --- /dev/null +++ b/src/Mod/Draft/draftguitools/gui_draft2sketch.py @@ -0,0 +1,155 @@ +# *************************************************************************** +# * (c) 2009, 2010 Yorik van Havre * +# * (c) 2009, 2010 Ken Cline * +# * (c) 2020 Eliud Cabrera Castillo * +# * * +# * This file is part of the FreeCAD CAx development system. * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * FreeCAD 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 Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with FreeCAD; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** +"""Provides tools for converting Draft objects to Sketches and back. + +Many Draft objects will be converted to a single non-contrainted Sketch. + +However, a single sketch with disconnected traces will be converted +into several individual Draft objects. +""" +## @package gui_draft2sketch +# \ingroup DRAFT +# \brief Provides tools for converting Draft objects to Sketches and back. + +from PySide.QtCore import QT_TRANSLATE_NOOP + +import FreeCADGui as Gui +import Draft_rc +import draftguitools.gui_base_original as gui_base_original +import draftguitools.gui_tool_utils as gui_tool_utils +from draftutils.messages import _msg +from draftutils.translate import translate, _tr + +# The module is used to prevent complaints from code checkers (flake8) +True if Draft_rc.__name__ else False + + +class Draft2Sketch(gui_base_original.Modifier): + """Gui Command for the Draft2Sketch tool.""" + + def GetResources(self): + """Set icon, menu and tooltip.""" + _menu = "Draft to Sketch" + _tip = ("Convert bidirectionally between Draft objects " + "and Sketches.\n" + "Many Draft objects will be converted into a single " + "non-constrained Sketch.\n" + "However, a single sketch with disconnected traces " + "will be converted into several individual Draft objects.") + + return {'Pixmap': 'Draft_Draft2Sketch', + 'MenuText': QT_TRANSLATE_NOOP("Draft_Draft2Sketch", _menu), + 'ToolTip': QT_TRANSLATE_NOOP("Draft_Draft2Sketch", _tip)} + + def Activated(self): + """Execute when the command is called.""" + super().Activated(name=_tr("Convert Draft/Sketch")) + if not Gui.Selection.getSelection(): + if self.ui: + self.ui.selectUi() + _msg(translate("draft", "Select an object to convert.")) + self.call = \ + self.view.addEventCallback("SoEvent", + gui_tool_utils.selectObject) + else: + self.proceed() + + def proceed(self): + """Proceed with the command if one object was selected.""" + if self.call: + self.view.removeEventCallback("SoEvent", self.call) + + sel = Gui.Selection.getSelection() + allSketches = True + allDraft = True + Gui.addModule("Draft") + for obj in sel: + if obj.isDerivedFrom("Sketcher::SketchObject"): + allDraft = False + elif obj.isDerivedFrom("Part::Part2DObjectPython"): + allSketches = False + else: + allDraft = False + allSketches = False + + if not sel: + return + elif allDraft: + _cmd = "Draft.makeSketch" + _cmd += "(" + _cmd += "FreeCADGui.Selection.getSelection(), " + _cmd += "autoconstraints=True" + _cmd += ")" + _cmd_list = ['sk = ' + _cmd, + 'FreeCAD.ActiveDocument.recompute()'] + self.commit(translate("draft", "Convert to Sketch"), + _cmd_list) + elif allSketches: + n = 0 + _cmd_list = list() + for o in sel: + _cmd = "Draft.draftify" + _cmd += "(" + _cmd += "FreeCAD.ActiveDocument." + o.Name + ", " + _cmd += "delete=False" + _cmd += ")" + _cmd_list.append("df" + str(n) + " = " + _cmd) + n += 1 + + _cmd_list.append('FreeCAD.ActiveDocument.recompute()') + self.commit(translate("draft", "Convert to Draft"), + _cmd_list) + else: + _cmd_list = list() + n = 0 + for obj in sel: + _cmd_df = "Draft.draftify" + _cmd_df += "(" + _cmd_df += "FreeCAD.ActiveDocument." + obj.Name + ", " + _cmd_df += "delete=False" + _cmd_df += ")" + + _cmd_sk = "Draft.makeSketch" + _cmd_sk += "(" + _cmd_sk += "FreeCAD.ActiveDocument." + obj.Name + ", " + _cmd_sk += "autoconstraints=True" + _cmd_sk += ")" + + if obj.isDerivedFrom("Sketcher::SketchObject"): + _cmd_list.append("obj" + str(n) + " = " + _cmd_df) + elif obj.isDerivedFrom("Part::Part2DObjectPython"): + _cmd_list.append("obj" + str(n) + " = " + _cmd_sk) + elif obj.isDerivedFrom("Part::Feature"): + # if (len(obj.Shape.Wires) == 1 + # or len(obj.Shape.Edges) == 1): + _cmd_list.append("obj" + str(n) + " = " + _cmd_sk) + n += 1 + _cmd_list.append('FreeCAD.ActiveDocument.recompute()') + self.commit(translate("draft", "Convert Draft/Sketch"), + _cmd_list) + self.finish() + + +Gui.addCommand('Draft_Draft2Sketch', Draft2Sketch())