From e450a8bee3987b4646fa0f0a12b51ae995d491a6 Mon Sep 17 00:00:00 2001 From: vocx-fc Date: Thu, 2 Apr 2020 13:26:54 -0600 Subject: [PATCH] Draft: move Point GuiCommand to gui_points module --- src/Mod/Draft/CMakeLists.txt | 1 + src/Mod/Draft/DraftTools.py | 83 +---------- src/Mod/Draft/draftguitools/gui_points.py | 159 ++++++++++++++++++++++ 3 files changed, 161 insertions(+), 82 deletions(-) create mode 100644 src/Mod/Draft/draftguitools/gui_points.py diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt index 939193a826..fc4acafec0 100644 --- a/src/Mod/Draft/CMakeLists.txt +++ b/src/Mod/Draft/CMakeLists.txt @@ -95,6 +95,7 @@ SET(Creator_tools draftguitools/gui_texts.py draftguitools/gui_dimensions.py draftguitools/gui_shapestrings.py + draftguitools/gui_points.py ) SET(Draft_GUI_tools diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 18cf1b4fde..8a55269af8 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -163,7 +163,7 @@ from draftguitools.gui_ellipses import Ellipse from draftguitools.gui_texts import Text from draftguitools.gui_dimensions import Dimension from draftguitools.gui_shapestrings import ShapeString - +from draftguitools.gui_points import Point # --------------------------------------------------------------------------- # Modifier functions @@ -2422,86 +2422,6 @@ class PointArray(Modifier): FreeCAD.ActiveDocument.recompute() self.finish() -class Point(Creator): - """this class will create a vertex after the user clicks a point on the screen""" - - def GetResources(self): - return {'Pixmap' : 'Draft_Point', - 'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_Point", "Point"), - 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_Point", "Creates a point object")} - - def IsActive(self): - if FreeCADGui.ActiveDocument: - return True - else: - return False - - def Activated(self): - Creator.Activated(self) - self.view = Draft.get3DView() - self.stack = [] - rot = self.view.getCameraNode().getField("orientation").getValue() - upv = Vector(rot.multVec(coin.SbVec3f(0,1,0)).getValue()) - plane.setup(self.view.getViewDirection().negative(), Vector(0,0,0), upv) - self.point = None - if self.ui: - self.ui.pointUi() - self.ui.continueCmd.show() - # adding 2 callback functions - self.callbackClick = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.click) - self.callbackMove = self.view.addEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.move) - - def move(self,event_cb): - event = event_cb.getEvent() - mousepos = event.getPosition().getValue() - ctrl = event.wasCtrlDown() - self.point = FreeCADGui.Snapper.snap(mousepos,active=ctrl) - if self.ui: - self.ui.displayPoint(self.point) - - def numericInput(self,numx,numy,numz): - """called when a numeric value is entered on the toolbar""" - self.point = FreeCAD.Vector(numx,numy,numz) - self.click() - - def click(self,event_cb=None): - if event_cb: - event = event_cb.getEvent() - if event.getState() != coin.SoMouseButtonEvent.DOWN: - return - if self.point: - self.stack.append(self.point) - if len(self.stack) == 1: - self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick) - self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove) - commitlist = [] - if Draft.getParam("UsePartPrimitives",False): - # using - commitlist.append((translate("draft","Create Point"), - ['point = FreeCAD.ActiveDocument.addObject("Part::Vertex","Point")', - 'point.X = '+str(self.stack[0][0]), - 'point.Y = '+str(self.stack[0][1]), - 'point.Z = '+str(self.stack[0][2]), - 'Draft.autogroup(point)', - 'FreeCAD.ActiveDocument.recompute()'])) - else: - # building command string - FreeCADGui.addModule("Draft") - commitlist.append((translate("draft","Create Point"), - ['point = Draft.makePoint('+str(self.stack[0][0])+','+str(self.stack[0][1])+','+str(self.stack[0][2])+')', - 'Draft.autogroup(point)', - 'FreeCAD.ActiveDocument.recompute()'])) - ToDo.delayCommit(commitlist) - FreeCADGui.Snapper.off() - self.finish() - - def finish(self,cont=False): - """terminates the operation and restarts if needed""" - Creator.finish(self) - if self.ui: - if self.ui.continueMode: - self.Activated() - class Draft_Clone(Modifier): """The Draft Clone command definition""" @@ -2869,7 +2789,6 @@ from draftguitools.gui_snaps import ShowSnapBar #--------------------------------------------------------------------------- # drawing commands -FreeCADGui.addCommand('Draft_Point',Point()) FreeCADGui.addCommand('Draft_Facebinder',Draft_Facebinder()) FreeCADGui.addCommand('Draft_Label',Draft_Label()) diff --git a/src/Mod/Draft/draftguitools/gui_points.py b/src/Mod/Draft/draftguitools/gui_points.py new file mode 100644 index 0000000000..39d5ff33b5 --- /dev/null +++ b/src/Mod/Draft/draftguitools/gui_points.py @@ -0,0 +1,159 @@ +# *************************************************************************** +# * (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 simple points with the Draft Workbench. + +A point is just a simple vertex with a position in 3D space. + +Its visual properties can be changed, like display size on screen +and color. +""" +## @package gui_points +# \ingroup DRAFT +# \brief Provides tools for creating simple points with the Draft Workbench. + +import pivy.coin as coin +from PySide.QtCore import QT_TRANSLATE_NOOP + +import FreeCAD as App +import FreeCADGui as Gui +import Draft_rc +import draftutils.utils as utils +import draftutils.gui_utils as gui_utils +import draftguitools.gui_base_original as gui_base_original +import draftutils.todo as todo +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 Point(gui_base_original.Creator): + """Gui Command for the Point tool.""" + + def GetResources(self): + """Set icon, menu and tooltip.""" + _tip = "Creates a point object. Click anywhere on the 3D view." + + return {'Pixmap': 'Draft_Point', + 'MenuText': QT_TRANSLATE_NOOP("Draft_Point", "Point"), + 'ToolTip': QT_TRANSLATE_NOOP("Draft_Point", _tip)} + + def Activated(self): + """Execute when the command is called.""" + super().Activated(name=_tr("Point")) + self.view = gui_utils.get3DView() + self.stack = [] + rot = self.view.getCameraNode().getField("orientation").getValue() + upv = App.Vector(rot.multVec(coin.SbVec3f(0, 1, 0)).getValue()) + App.DraftWorkingPlane.setup(self.view.getViewDirection().negative(), + App.Vector(0, 0, 0), + upv) + self.point = None + if self.ui: + self.ui.pointUi() + self.ui.continueCmd.show() + # adding 2 callback functions + self.callbackClick = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.click) + self.callbackMove = self.view.addEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(), self.move) + + def move(self, event_cb): + """Execute as a callback when the pointer moves in the 3D view. + + It should automatically update the coordinates in the widgets + of the task panel. + """ + event = event_cb.getEvent() + mousepos = event.getPosition().getValue() + ctrl = event.wasCtrlDown() + self.point = Gui.Snapper.snap(mousepos, active=ctrl) + if self.ui: + self.ui.displayPoint(self.point) + + 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.click() + + def click(self, event_cb=None): + """Execute as a callback when the pointer clicks on the 3D view. + + It should act as if the Enter key was pressed, or the OK button + was pressed in the task panel. + """ + if event_cb: + event = event_cb.getEvent() + if event.getState() != coin.SoMouseButtonEvent.DOWN: + return + if self.point: + self.stack.append(self.point) + if len(self.stack) == 1: + self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callbackClick) + self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(), self.callbackMove) + # The command to run is built as a series of text strings + # to be commited through the `draftutils.todo.ToDo` class. + commitlist = [] + if utils.getParam("UsePartPrimitives", False): + # Insert a Part::Primitive object + _cmd = 'FreeCAD.ActiveDocument.' + _cmd += 'addObject("Part::Vertex", "Point")' + _cmd_list = ['point = ' + _cmd, + 'point.X = ' + str(self.stack[0][0]), + 'point.Y = ' + str(self.stack[0][1]), + 'point.Z = ' + str(self.stack[0][2]), + 'Draft.autogroup(point)', + 'FreeCAD.ActiveDocument.recompute()'] + commitlist.append((translate("draft", "Create Point"), + _cmd_list)) + else: + # Insert a Draft point + Gui.addModule("Draft") + _cmd = 'Draft.makePoint' + _cmd += '(' + _cmd += str(self.stack[0][0]) + ', ' + _cmd += str(self.stack[0][1]) + ', ' + _cmd += str(self.stack[0][2]) + _cmd += ')' + _cmd_list = ['point = ' + _cmd, + 'Draft.autogroup(point)', + 'FreeCAD.ActiveDocument.recompute()'] + commitlist.append((translate("draft", "Create Point"), + _cmd_list)) + todo.ToDo.delayCommit(commitlist) + Gui.Snapper.off() + self.finish() + + def finish(self, cont=False): + """Terminate the operation and restart if needed.""" + super().finish() + if self.ui: + if self.ui.continueMode: + self.Activated() + + +Gui.addCommand('Draft_Point', Point())