--- a/graphics/GraphicCommons.py Fri May 24 11:17:35 2013 +0200
+++ b/graphics/GraphicCommons.py Fri May 24 16:29:57 2013 +0200
@@ -437,123 +437,6 @@
self.AccessLock.release()
#-------------------------------------------------------------------------------
-#-------------------------------------------------------------------------------
-Class that implements a rubberband
- # Create a rubberband by indicated on which window it must be drawn
- def __init__(self, viewer):
- self.drawingSurface = viewer.Editor
- # Method that initializes the internal attributes of the rubberband
- # Method that return if a box is currently edited
- return self.currentBox != None
- # Method that returns the currently edited box
- def GetCurrentExtent(self):
- if self.currentBox is None:
- # Method called when a new box starts to be edited
- def OnLeftDown(self, event, dc, scaling):
- pos = GetScaledEventPosition(event, dc, scaling)
- # Save the point for calculate the box position and size
- self.currentBox = wx.Rect(pos.x, pos.y, 0, 0)
- self.drawingSurface.SetCursor(wx.StockCursor(wx.CURSOR_CROSS))
- # Method called when dragging with a box edited
- def OnMotion(self, event, dc, scaling):
- pos = GetScaledEventPosition(event, dc, scaling)
- # Save the last position and size of the box for erasing it
- self.lastBox = wx.Rect(self.currentBox.x, self.currentBox.y, self.currentBox.width,
- self.currentBox.height)
- # Calculate new position and size of the box
- if pos.x >= self.startPoint.x:
- self.currentBox.x = self.startPoint.x
- self.currentBox.width = pos.x - self.startPoint.x + 1
- self.currentBox.x = pos.x
- self.currentBox.width = self.startPoint.x - pos.x + 1
- if pos.y >= self.startPoint.y:
- self.currentBox.y = self.startPoint.y
- self.currentBox.height = pos.y - self.startPoint.y + 1
- self.currentBox.y = pos.y
- self.currentBox.height = self.startPoint.y - pos.y + 1
- # Method called when dragging is stopped
- def OnLeftUp(self, event, dc, scaling):
- self.drawingSurface.SetCursor(wx.NullCursor)
- self.lastBox = self.currentBox
- # Method that erase the last box and draw the new box
- def Redraw(self, dc = None):
- dc = self.Viewer.GetLogicalDC()
- scalex, scaley = dc.GetUserScale()
- dc.SetPen(wx.Pen(wx.WHITE, 1, wx.DOT))
- dc.SetBrush(wx.TRANSPARENT_BRUSH)
- dc.SetLogicalFunction(wx.XOR)
- dc.DrawRectangle(self.lastBox.x * scalex, self.lastBox.y * scaley,
- self.lastBox.width * scalex, self.lastBox.height * scaley)
- dc.DrawRectangle(self.currentBox.x * scalex, self.currentBox.y * scaley,
- self.currentBox.width * scalex, self.currentBox.height * scaley)
- dc.SetUserScale(scalex, scaley)
- def Erase(self, dc = None):
- dc = self.Viewer.GetLogicalDC()
- scalex, scaley = dc.GetUserScale()
- dc.SetPen(wx.Pen(wx.WHITE, 1, wx.DOT))
- dc.SetBrush(wx.TRANSPARENT_BRUSH)
- dc.SetLogicalFunction(wx.XOR)
- dc.DrawRectangle(self.lastBox.x * scalex, self.lastBox.y * scaley,
- self.lastBox.width * scalex, self.lastBox.height * scalex)
- dc.SetUserScale(scalex, scaley)
- def Draw(self, dc = None):
- dc = self.Viewer.GetLogicalDC()
- scalex, scaley = dc.GetUserScale()
- dc.SetPen(wx.Pen(wx.WHITE, 1, wx.DOT))
- dc.SetBrush(wx.TRANSPARENT_BRUSH)
- dc.SetLogicalFunction(wx.XOR)
- dc.DrawRectangle(self.currentBox.x * scalex, self.currentBox.y * scaley,
- self.currentBox.width * scalex, self.currentBox.height * scaley)
- dc.SetUserScale(scalex, scaley)
-#-------------------------------------------------------------------------------
# Helpers for highlighting text
#-------------------------------------------------------------------------------
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphics/RubberBand.py Fri May 24 16:29:57 2013 +0200
@@ -0,0 +1,192 @@
+#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor +#based on the plcopen standard. +#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD +#See COPYING file for copyrights details. +#This library is free software; you can redistribute it and/or +#modify it under the terms of the GNU 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 +#General Public License for more details. +#You should have received a copy of the GNU 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 +from graphics.GraphicCommons import GetScaledEventPosition +#------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- +Class that implements a rubberband for graphic Viewers + def __init__(self, viewer): + @param viewer: Viewer on which rubberband must be drawn + # wx.Panel on which rubberband will be drawn + self.DrawingSurface = viewer.Editor + Initialize internal attributes of rubberband + self.CurrentBBox = None + Indicate if rubberband is drawn on viewer + @return: True if rubberband is drawn + return self.CurrentBBox != None + def GetCurrentExtent(self): + Return the rubberband bounding box + @return: Rubberband bounding box (wx.Rect object) + # In case of rubberband not shown, return the last rubberband + return self.CurrentBBox + def OnLeftDown(self, event, dc, scaling): + Called when left mouse is pressed on Viewer. Starts to edit a new + rubberband bounding box + @param event: Mouse event + @param dc: Device Context of Viewer + @param scaling: PLCOpen scaling applied on Viewer + # Save the point where mouse was pressed in Viewer unit, position may + # be modified by scroll and zoom applied on viewer + self.StartPoint = GetScaledEventPosition(event, dc, scaling) + # Initialize rubberband bounding box + self.CurrentBBox = wx.Rect(self.StartPoint.x, self.StartPoint.y, 0, 0) + # Change viewer mouse cursor to reflect a rubberband bounding box is + self.DrawingSurface.SetCursor(wx.StockCursor(wx.CURSOR_CROSS)) + def OnMotion(self, event, dc, scaling): + Called when mouse is dragging over Viewer. Update the current edited + rubberband bounding box + @param event: Mouse event + @param dc: Device Context of Viewer + @param scaling: PLCOpen scaling applied on Viewer + # Get mouse position in Viewer unit, position may be modified by scroll + # and zoom applied on viewer + pos = GetScaledEventPosition(event, dc, scaling) + # Save the last bounding box drawn for erasing it later + self.LastBBox = wx.Rect(0, 0, 0, 0) + self.LastBBox.Union(self.CurrentBBox) + # Calculate new position and size of the box + self.CurrentBBox.x = min(pos.x, self.StartPoint.x) + self.CurrentBBox.y = min(pos.y, self.StartPoint.y) + self.CurrentBBox.width = abs(pos.x - self.StartPoint.x) + 1 + self.CurrentBBox.height = abs(pos.y - self.StartPoint.y) + 1 + def OnLeftUp(self, event, dc, scaling): + Called when mouse is release from Viewer. Erase the current edited + rubberband bounding box + @param event: Mouse event + @param dc: Device Context of Viewer + @param scaling: PLCOpen scaling applied on Viewer + # Change viewer mouse cursor to default + self.DrawingSurface.SetCursor(wx.NullCursor) + # Save the last edited bounding box + self.LastBBox = self.CurrentBBox + self.CurrentBBox = None + def DrawBoundingBoxes(self, bboxes, dc=None): + Draw a list of bounding box on Viewer in the order given using XOR + @param bboxes: List of bounding boxes to draw on viewer + @param dc: Device Context of Viewer (default None) + # Get viewer Device Context if not given + dc = self.Viewer.GetLogicalDC() + # Save current viewer scale factors before resetting them in order to + # avoid rubberband pen to be scaled + scalex, scaley = dc.GetUserScale() + dc.SetPen(wx.Pen(wx.WHITE, style=wx.DOT)) + dc.SetBrush(wx.TRANSPARENT_BRUSH) + dc.SetLogicalFunction(wx.XOR) + # Draw the bounding boxes using viewer scale factor + bbox.x * scalex, bbox.y * scaley, + bbox.width * scalex, bbox.height * scaley) + # Restore Viewer scale factor + dc.SetUserScale(scalex, scaley) + def Redraw(self, dc = None): + Redraw rubberband on Viewer + @param dc: Device Context of Viewer (default None) + # Erase last bbox and draw current bbox + self.DrawBoundingBoxes([self.LastBBox, self.CurrentBBox], dc) + def Erase(self, dc = None): + Erase rubberband from Viewer + @param dc: Device Context of Viewer (default None) + self.DrawBoundingBoxes([self.LastBBox], dc) + def Draw(self, dc = None): + Draw rubberband on Viewer + @param dc: Device Context of Viewer (default None) + # Erase last bbox and draw current bbox + self.DrawBoundingBoxes([self.CurrentBBox], dc) --- a/graphics/__init__.py Fri May 24 11:17:35 2013 +0200
+++ b/graphics/__init__.py Fri May 24 16:29:57 2013 +0200
@@ -27,4 +27,5 @@
from GraphicCommons import *
from FBD_Objects import *
-from SFC_Objects import *
\ No newline at end of file
+from SFC_Objects import * +from RubberBand import RubberBand \ No newline at end of file