Wanted to try out the group option of floatcanvas (i.e. not FC2).
So, translated my FC2 sample to FC, got a bit confused about the
position stuff, but at the end made it.
Very surprised/pleased with the difference in speed of FC (attached)
when comparing it with my FC2 trial.
Figured out how to move (by copy/pasting :)) the "frame" of a rack, but
I am unsure on how to move the "children" i.e. the bottles (circles). I
guess that I could use the group to get its members and then move them.
But how do I get from the "rackFrame" to the "rackUnit" (which is the
group) and from there to its members?
Assuming I can get at the members, would adding the following to
OnLeftUp be enough to move them?
newPos = event.GetPosition()
movedBy = newPos - self.StartPoint
for member in members:
dxy = member.GetPosition() - movedBy
dxy = self.canvas.ScalePixelToWorld(dxy)
member.Move(dxy)
Would appreciate a few hints on this.
Werner
#Boa:Frame:Frame1
"""using fc instead of fc2
"""
import wx
import wx.lib.agw.aui as aui
# import the floatcanvas module
from wx.lib.floatcanvas import NavCanvas, Resources
import wx.lib.floatcanvas.FloatCanvas as fc
import numpy as N
##import gettext
class MovingObjectMixin:
"""
Methods required for a Moving object
"""
def GetOutlinePoints(self):
BB = self.BoundingBox
OutlinePoints = N.array( ( (BB[0,0], BB[0,1]),
(BB[0,0], BB[1,1]),
(BB[1,0], BB[1,1]),
(BB[1,0], BB[0,1]),
)
)
return OutlinePoints
class MovingRectangle(fc.Rectangle, MovingObjectMixin):
"""
Rectangle Object that can be moved
"""
## All we need to do is is inherit from:
## Rectangle, MovingObjectMixin
pass
class MovingCircle(fc.Circle, MovingObjectMixin):
"""
Circle Object that can be moved
"""
## All we need to do is is inherit from:
## Circle, MovingObjectMixin
pass
def create(parent):
return Frame1(parent)
[wxID_FRAME1, wxID_FRAME1PANEL1,
] = [wx.NewId() for _init_ctrls in range(2)]
class Frame1(wx.Frame):
def _init_ctrls(self, prnt):
# generated method, don't edit
wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
pos=wx.Point(448, 171), size=wx.Size(906, 625),
style=wx.DEFAULT_FRAME_STYLE, title='Frame1')
self.SetClientSize(wx.Size(890, 587))
self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
pos=wx.Point(0, 0), size=wx.Size(890, 587),
style=wx.TAB_TRAVERSAL)
def __init__(self, parent):
self._init_ctrls(parent)
# setup aui
self._mgr = aui.AuiManager()
self._mgr.SetManagedWindow(self.panel1)
# Add the Canvas
self.navCanvas = NavCanvas.NavCanvas(self.panel1, -1, (800,800),
ProjectionFun = None,
Debug = 0,
)
self.canvas = self.navCanvas.Canvas
self.canvas.Bind(fc.EVT_MOTION, self.OnMove )
self.canvas.Bind(fc.EVT_LEFT_UP, self.OnLeftUp )
self._mgr.AddPane(self.navCanvas, aui.AuiPaneInfo().
Name("Canvas").Caption('Canvas').
CenterPane().MinimizeButton(False).MaximizeButton(True))
# create toolbar
self.myTB = wx.ToolBar(self.panel1, -1, wx.DefaultPosition, wx.DefaultSize,
wx.TB_FLAT | wx.TB_NODIVIDER)
self.myTB.SetToolBitmapSize(wx.Size(32,32))
self.CreateMyToolBar()
self._mgr.AddPane(self.myTB, aui.AuiPaneInfo().
Name("Toolbar").Caption('Toolbar').
ToolbarPane().Top().
LeftDockable(False).RightDockable(False))
self._mgr.Update()
def CreateMyToolBar(self):
toolSize = (32, 32)
self.myTB.SetToolBitmapSize(toolSize)
self.myTB.SetBackgroundColour(self.GetBackgroundColour())
bmp = wx.EmptyBitmap(32, 32)
bmpDA = wx.EmptyBitmap(32, 32)
self.wxId_myTBSingleStack =wx.NewId()
## img = myimages.getbottlePurImage()
## imgGO = myimages.getbottlePurImage()
## imgutil.grayOut(imgGO)
## bmp = wx.BitmapFromImage(img)
## bmpDA = wx.BitmapFromImage(imgGO)
self.myTB.AddLabelTool(label = u'Add a single stack rack',
bitmap = bmp,
bmpDisabled = bmpDA,
id = self.wxId_myTBSingleStack,
longHelp = u'',
shortHelp = u'')
self.Bind(wx.EVT_TOOL, self.addRackUnit, id=self.wxId_myTBSingleStack)
self.wxId_myTBDoubleStack =wx.NewId()
self.myTB.AddLabelTool(label = u'Add a double stack rack',
bitmap = bmp,
bmpDisabled = bmpDA,
id = self.wxId_myTBDoubleStack,
longHelp = u'',
shortHelp = u'')
self.Bind(wx.EVT_TOOL, self.addRackUnit2, id=self.wxId_myTBDoubleStack)
self.myTB.Realize()
self.myTB.EnableTool(self.wxId_myTBSingleStack, True)
self.myTB.EnableTool(self.wxId_myTBDoubleStack, True)
self.myTB.Refresh()
self.MoveObject = None
self.Moving = False
def addRackUnit(self, evt):
"""a single stacked bottle rack"""
wx.BeginBusyCursor()
rackUnit = fc.Group()
self.canvas.AddObject(rackUnit)
rackFrame = MovingRectangle((0, 0), (200, 400))
self.canvas.AddObject(rackFrame)
rackUnit.AddObjects((rackFrame, ))
nRows = 20
startRowPos = -10
nCols = 10
startColPos = -10
for rowPos in range(nRows):
startRowPos += 20
actColPos = startColPos
for colPos in range(nCols):
actColPos += 20
botName = 'Bottle %i' % colPos
bot = MovingCircle((actColPos, startRowPos), 20, LineColor='blue', LineWidth=2)
self.canvas.AddObject(bot)
rackUnit.AddObjects((bot, ))
self.canvas.ZoomToBB()
wx.EndBusyCursor()
def addRackUnit2(self, evt):
"""a double stacked bottle rack"""
wx.BeginBusyCursor()
rackUnit = fc.Group()
self.canvas.AddObject(rackUnit)
rackFrame = MovingRectangle((202, 0), (200, 400))
self.canvas.AddObject(rackFrame)
rackUnit.AddObjects((rackFrame, ))
rackFrame.Bind(fc.EVT_FC_LEFT_DOWN, self.ObjectHit)
nRows = 20
startRowPos = -10
nCols = 10
startColPos = 192
for rowPos in range(nRows):
startRowPos += 20
actColPos = startColPos
for colPos in range(nCols):
actColPos += 20
botName = 'Bottle %i' % colPos
bot = MovingCircle((actColPos, startRowPos), 20, LineColor='blue', LineWidth=2)
self.canvas.AddObject(bot)
rackUnit.AddObjects((bot, ))
# back stack
nRows += -1
startRowPos = 0
nCols += -1
startColPos = 202
for rowPos in range(nRows):
startRowPos += 20
actColPos = startColPos
for colPos in range(nCols):
actColPos += 20
botName = 'Bottle %i' % colPos
bot = MovingCircle((actColPos, startRowPos), 10, LineColor='red', LineWidth=2)
self.canvas.AddObject(bot)
rackUnit.AddObjects((bot, ))
self.canvas.ZoomToBB()
wx.EndBusyCursor()
def ObjectHit(self, object):
if not self.Moving:
self.Moving = True
self.StartPoint = object.HitCoordsPixel
self.StartObject = self.canvas.WorldToPixel(object.GetOutlinePoints())
self.MoveObject = None
self.MovingObject = object
def OnMove(self, event):
"""
Updates the status bar with the world coordinates
and moves the object it is clicked on
"""
## self.SetStatusText("%.4f, %.4f"%tuple(event.Coords))
if self.Moving:
dxy = event.GetPosition() - self.StartPoint
# Draw the Moving Object:
dc = wx.ClientDC(self.canvas)
dc.SetPen(wx.Pen('WHITE', 2, wx.SHORT_DASH))
dc.SetBrush(wx.TRANSPARENT_BRUSH)
dc.SetLogicalFunction(wx.XOR)
if self.MoveObject is not None:
dc.DrawPolygon(self.MoveObject)
self.MoveObject = self.StartObject + dxy
dc.DrawPolygon(self.MoveObject)
def OnLeftUp(self, event):
if self.Moving:
self.Moving = False
if self.MoveObject is not None:
dxy = event.GetPosition() - self.StartPoint
dxy = self.canvas.ScalePixelToWorld(dxy)
self.MovingObject.Move(dxy)
## self.MoveTri = None
self.canvas.Draw(True)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = create(None)
frame.Show()
app.MainLoop()
_______________________________________________
FloatCanvas mailing list
[email protected]
http://paulmcnett.com/cgi-bin/mailman/listinfo/floatcanvas