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

Reply via email to