From b928823768bc8a24f535f27fcbe8eb3527c1a14a Mon Sep 17 00:00:00 2001 From: vocx-fc Date: Wed, 1 Apr 2020 18:56:34 -0600 Subject: [PATCH] Draft: move Text GuiCommand to gui_texts module --- src/Mod/Draft/CMakeLists.txt | 1 + src/Mod/Draft/DraftTools.py | 82 +----------- src/Mod/Draft/draftguitools/gui_texts.py | 152 +++++++++++++++++++++++ 3 files changed, 154 insertions(+), 81 deletions(-) create mode 100644 src/Mod/Draft/draftguitools/gui_texts.py diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index b912a09edd..c11d4ad956 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -92,6 +92,7 @@ SET(Creator_tools draftguitools/gui_circles.py draftguitools/gui_polygons.py draftguitools/gui_ellipses.py + draftguitools/gui_texts.py ) SET(Draft_GUI_tools diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 05131957a8..9a630f53b2 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -161,86 +161,7 @@ from draftguitools.gui_arcs import Draft_Arc_3Points from draftguitools.gui_circles import Circle from draftguitools.gui_polygons import Polygon from draftguitools.gui_ellipses import Ellipse - - -class Text(Creator): - """This class creates an annotation feature.""" - - def GetResources(self): - return {'Pixmap' : 'Draft_Text', - 'Accel' : "T, E", - 'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_Text", "Text"), - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Text", "Creates an annotation. CTRL to snap")} - - def Activated(self): - name = translate("draft","Text") - Creator.Activated(self,name) - if self.ui: - self.dialog = None - self.text = '' - self.ui.sourceCmd = self - self.ui.pointUi(name) - self.call = self.view.addEventCallback("SoEvent",self.action) - self.active = True - self.ui.xValue.setFocus() - self.ui.xValue.selectAll() - FreeCAD.Console.PrintMessage(translate("draft", "Pick location point")+"\n") - FreeCADGui.draftToolBar.show() - - def finish(self,closed=False,cont=False): - """terminates the operation""" - Creator.finish(self) - if self.ui: - del self.dialog - if self.ui.continueMode: - self.Activated() - - def createObject(self): - """creates an object in the current doc""" - tx = '[' - for l in self.text: - if len(tx) > 1: - tx += ',' - if sys.version_info.major < 3: - l = unicode(l) - tx += '"'+str(l.encode("utf8"))+'"' - else: - tx += '"'+l+'"' #Python3 no more unicode - tx += ']' - FreeCADGui.addModule("Draft") - self.commit(translate("draft","Create Text"), - ['text = Draft.makeText('+tx+',point='+DraftVecUtils.toString(self.node[0])+')', - 'Draft.autogroup(text)', - 'FreeCAD.ActiveDocument.recompute()']) - FreeCAD.ActiveDocument.recompute() - - self.finish(cont=True) - - def action(self,arg): - """scene event handler""" - if arg["Type"] == "SoKeyboardEvent": - if arg["Key"] == "ESCAPE": - self.finish() - elif arg["Type"] == "SoLocation2Event": #mouse movement detection - if self.active: - self.point,ctrlPoint,info = getPoint(self,arg) - redraw3DView() - elif arg["Type"] == "SoMouseButtonEvent": - if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - if self.point: - self.active = False - FreeCADGui.Snapper.off() - self.node.append(self.point) - self.ui.textUi() - self.ui.textValue.setFocus() - - def numericInput(self,numx,numy,numz): - '''this function gets called by the toolbar when valid - x, y, and z have been entered there''' - self.point = Vector(numx,numy,numz) - self.node.append(self.point) - self.ui.textUi() - self.ui.textValue.setFocus() +from draftguitools.gui_texts import Text class Dimension(Creator): @@ -3432,7 +3353,6 @@ from draftguitools.gui_snaps import ShowSnapBar #--------------------------------------------------------------------------- # drawing commands -FreeCADGui.addCommand('Draft_Text',Text()) FreeCADGui.addCommand('Draft_Dimension',Dimension()) FreeCADGui.addCommand('Draft_Point',Point()) FreeCADGui.addCommand('Draft_ShapeString',ShapeString()) diff --git a/src/Mod/Draft/draftguitools/gui_texts.py b/src/Mod/Draft/draftguitools/gui_texts.py new file mode 100644 index 0000000000..0470563aa3 --- /dev/null +++ b/src/Mod/Draft/draftguitools/gui_texts.py @@ -0,0 +1,152 @@ +# *************************************************************************** +# * (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 creating text annotations with the Draft Workbench. + +The textual block can consist of multiple lines. +""" +## @package gui_texts +# \ingroup DRAFT +# \brief Provides tools for creating text annotations with the Draft Workbench. + +from PySide.QtCore import QT_TRANSLATE_NOOP +import sys + +import FreeCAD as App +import FreeCADGui as Gui +import Draft_rc +import DraftVecUtils +import draftguitools.gui_base_original as gui_base_original +import draftguitools.gui_tool_utils as gui_tool_utils +from draftutils.translate import translate +from draftutils.messages import _msg + +# The module is used to prevent complaints from code checkers (flake8) +True if Draft_rc.__name__ else False + + +class Text(gui_base_original.Creator): + """Gui command for the Text tool.""" + + def GetResources(self): + """Set icon, menu and tooltip.""" + _tip = "Creates a multi-line annotation. CTRL to snap." + + return {'Pixmap': 'Draft_Text', + 'Accel': "T, E", + 'MenuText': QT_TRANSLATE_NOOP("Draft_Text", "Text"), + 'ToolTip': QT_TRANSLATE_NOOP("Draft_Text", _tip)} + + def Activated(self): + """Execute when the command is called.""" + name = translate("draft", "Text") + super().Activated(name) + if self.ui: + self.dialog = None + self.text = '' + self.ui.sourceCmd = self + self.ui.pointUi(name) + self.call = self.view.addEventCallback("SoEvent", self.action) + self.active = True + self.ui.xValue.setFocus() + self.ui.xValue.selectAll() + _msg(translate("draft", "Pick location point")) + Gui.draftToolBar.show() + + def finish(self, closed=False, cont=False): + """Terminate the operation.""" + super().finish(self) + if self.ui: + del self.dialog + if self.ui.continueMode: + self.Activated() + + def createObject(self): + """Create the actual object in the current document.""" + txt = '[' + for line in self.text: + if len(txt) > 1: + txt += ', ' + if sys.version_info.major < 3: + # Python2, string needs to be converted to unicode + line = unicode(line) + txt += '"' + str(line.encode("utf8")) + '"' + else: + # Python3, string is already unicode + txt += '"' + line + '"' + txt += ']' + Gui.addModule("Draft") + _cmd = 'Draft.makeText' + _cmd += '(' + _cmd += txt + ', ' + _cmd += 'point=' + DraftVecUtils.toString(self.node[0]) + _cmd += ')' + _cmd_list = ['text = ' + _cmd, + 'Draft.autogroup(text)', + 'FreeCAD.ActiveDocument.recompute()'] + self.commit(translate("draft", "Create Text"), + _cmd_list) + self.finish(cont=True) + + def action(self, arg): + """Handle the 3D scene events. + + This is installed as an EventCallback in the Inventor view. + + Parameters + ---------- + arg: dict + Dictionary with strings that indicates the type of event received + from the 3D view. + """ + if arg["Type"] == "SoKeyboardEvent": + if arg["Key"] == "ESCAPE": + self.finish() + elif arg["Type"] == "SoLocation2Event": # mouse movement detection + if self.active: + (self.point, + ctrlPoint, info) = gui_tool_utils.getPoint(self, arg) + gui_tool_utils.redraw3DView() + elif arg["Type"] == "SoMouseButtonEvent": + if arg["State"] == "DOWN" and arg["Button"] == "BUTTON1": + if self.point: + self.active = False + Gui.Snapper.off() + self.node.append(self.point) + self.ui.textUi() + self.ui.textValue.setFocus() + + def numericInput(self, numx, numy, numz): + """Validate the entry fields in the user interface. + + This function is called by the toolbar or taskpanel interface + when valid x, y, and z have been entered in the input fields. + """ + self.point = App.Vector(numx, numy, numz) + self.node.append(self.point) + self.ui.textUi() + self.ui.textValue.setFocus() + + +Gui.addCommand('Draft_Text', Text())