Hi Chris,

I finally managed to recreate my problem with a changed version of the GroupDemo.py which I attach.

Un-comment line 205 to have the yellow rectangle show to the right of the circles/box created by "doUnitSingleBottle".

Can you see with this what I am doing wrong/missing or .....

Have a nice weekend
Werner


# -*- coding: utf-8 -*-#
# Copyright:   see cr_and_license.txt in the doc folder
# License:     see cr_and_license.txt in the doc folder
#-----------------------------------------------------------------------------
#!/usr/bin/env python

"""
wine rack utilities
"""

import wx
import wx.lib.floatcanvas.FloatCanvas as fc
_ = wx.GetTranslation

#import xmlutils as uxml

import numpy as N

# support rack unit types
UNITTYPESINGLE = 1
UNITTYPEDOUBLE = 2
UNITTYPEDOUBLEALT = 3
UNITTYPETRIANGLE = 4
UNITTYPETRIANGLEALT = 5
UNITTYPEDIAMOND = 6
UNITTYPERECT = 7

# description for above
UNITTYPEDESC = {}
UNITTYPEDESC[1] = _(u"Single stack rack unit")
UNITTYPEDESC[2] = _(u"Double stack rack unit")
UNITTYPEDESC[3] = _(u"Double stack rack unit - alternative")
UNITTYPEDESC[4] = _(u"Triangle rack unit")
UNITTYPEDESC[5] = _(u"Triangle rack unit - alternative")
UNITTYPEDESC[6] = _(u"Diamond rack unit")
UNITTYPEDESC[7] = _(u"Rectangle rack unit")

class RackUnitPersistanceMixin:
    """Variable and methods to persist a rack unit"""
    def __init__(self):
        self._rackUnitId = 0
        self._rackUnitType = 0

    @property
    def rackUnitId(self):
        return self._rackUnitId

    @rackUnitId.setter
    def rackUnitId(self, tid):
        self._rackUnitId = tid

    @property
    def rackUnitType(self):
        return self._rackUnitType

    @rackUnitType.setter
    def rackUnitType(self, ttype):
        self._rackUnitType = ttype

    def saveShapes(self, xmlDoc):
        """Save the rack unit shape and its sub-shapes"""
        shapes = uxml.addElement(xmlDoc.modules, u"MovingGroup")

        uxml.addElementPlusValue(shapes, u"rackunittype", self.rackUnitType)
        uxml.addElementPlusValue(shapes, u"rackunitid", self.rackUnitId)

        for shape in self.ObjectList:
            shape.saveShape(shapes)


class RackItemPersistanceMixin:
    """Variables for a rack item to be persisted"""
    def __init__(self):
        self._rackItemId = 0
        
    @property
    def rackItemId(self):
        return self._rackItemId

    @rackItemId.setter
    def rackItemId(self, id):
        self._rackItemId = id


class RackItemSimpleRectPersistanceMixin:
    """Variables for a simple rect unit to be persisted"""
    def __init__(self):
        self._rackUnitId = 0
        self._rackItemId = 0
        self._rackUnitType = 0

    @property
    def rackUnitId(self):
        return self._rackUnitId

    @rackUnitId.setter
    def rackUnitId(self, tid):
        self._rackUnitId = tid        

    @property
    def rackItemId(self):
        return self._rackItemId

    @rackItemId.setter
    def rackItemId(self, id):
        self._rackItemId = id

    @property
    def rackUnitType(self):
        return self._rackUnitType

    @rackUnitType.setter
    def rackUnitType(self, ttype):
        self._rackUnitType = ttype


class PersistMovingSimpleRectMixin(RackItemSimpleRectPersistanceMixin):
    """Persistance for a MovingSimpleRect"""
    def __init__(self, *args, **kwargs):
        RackItemSimpleRectPersistanceMixin.__init__(self)
    
    def saveShape(self, xmldoc):
        """Save the shape"""
        klass = uxml.addElement(xmldoc.modules, u"MovingSimpleRectangle")
        uxml.addElementPlusValue(klass, u"width", self.WH[0])
        uxml.addElementPlusValue(klass, u"height", self.WH[1])

        uxml.addElementPlusValue(klass, u"x", self.XY[0])
        uxml.addElementPlusValue(klass, u"y", self.XY[1])

        uxml.addElementPlusValue(klass, u"linewidth", self.LineWidth)
        uxml.addElementPlusValue(klass, u"linecolour", self.LineColor)
        uxml.addElementPlusValue(klass, u"fillcolour", self.FillColor)
        uxml.addElementPlusValue(klass, u"fillstyle", self.FillStyle)

        uxml.addElementPlusValue(klass, u"rackunittype", self.rackUnitType)
        uxml.addElementPlusValue(klass, u"rackunitid", self.rackUnitId)
        uxml.addElementPlusValue(klass, u"rackitemid", self.rackItemId)


class PersistMovingRectMixin:
    """Persistance for a MovingRect"""
    
    def saveShape(self, xmldoc):
        """Save the shape"""
        klass = uxml.addElement(xmldoc, u"MovingRectangle")
        uxml.addElementPlusValue(klass, u"width", self.WH[0])
        uxml.addElementPlusValue(klass, u"height", self.WH[1])

        uxml.addElementPlusValue(klass, u"x", self.XY[0])
        uxml.addElementPlusValue(klass, u"y", self.XY[1])

        uxml.addElementPlusValue(klass, u"linewidth", self.LineWidth)
        uxml.addElementPlusValue(klass, u"linecolour", self.LineColor)
        uxml.addElementPlusValue(klass, u"fillcolour", self.FillColor)
        uxml.addElementPlusValue(klass, u"fillstyle", self.FillStyle)



class PersistMovingCircleMixin(RackItemPersistanceMixin):
    """Persistance for a MovingCircle"""
    def __init__(self, *args, **kwargs):
        RackItemPersistanceMixin.__init__(self)
    
    def saveShape(self, xmldoc):
        """Save the shape"""
        klass = uxml.addElement(xmldoc, u"MovingCircle")
        uxml.addElementPlusValue(klass, u"diameter", self.WH[0]*2)

        uxml.addElementPlusValue(klass, u"x", self.XY[0])
        uxml.addElementPlusValue(klass, u"y", self.XY[1])

        uxml.addElementPlusValue(klass, u"linewidth", self.LineWidth)
        uxml.addElementPlusValue(klass, u"linecolour", self.LineColor)
        uxml.addElementPlusValue(klass, u"fillcolour", self.FillColor)
        uxml.addElementPlusValue(klass, u"fillstyle", self.FillStyle)

        uxml.addElementPlusValue(klass, u"rackitemid", self.rackItemId)


class PersistMovingPolygonMixin(RackItemPersistanceMixin):
    """Persistance for a MovingPolygon"""
    def __init__(self, *args, **kwargs):
        RackItemPersistanceMixin.__init__(self)
    
    def saveShape(self, xmldoc):
        """Save the shape"""
        klass = uxml.addElement(xmldoc, u"MovingPolygon")
        points = uxml.addElement(klass, u"points")
        for wxp in self.Points:
            points.xml_append_fragment('<point><x>%i</x><y>%i</y></point>' % (wxp[0], wxp[1]))

        uxml.addElementPlusValue(klass, u"linewidth", self.LineWidth)
        uxml.addElementPlusValue(klass, u"linecolour", self.LineColor)
        uxml.addElementPlusValue(klass, u"fillcolour", self.FillColor)
        uxml.addElementPlusValue(klass, u"fillstyle", self.FillStyle)

        uxml.addElementPlusValue(klass, u"rackitemid", self.rackItemId)


class PersistMovingPolygonFrameMixin:
    """Persistance for a MovingPolygon frame"""
    
    def saveShape(self, xmldoc):
        """Save the shape"""
        klass = uxml.addElement(xmldoc, u"MovingPolygon")
        points = uxml.addElement(klass, u"points")
        for wxp in self.Points:
            points.xml_append_fragment('<point><x>%i</x><y>%i</y></point>' % (wxp[0], wxp[1]))

        uxml.addElementPlusValue(klass, u"linewidth", self.LineWidth)
        uxml.addElementPlusValue(klass, u"linecolour", self.LineColor)
        uxml.addElementPlusValue(klass, u"fillcolour", self.FillColor)
        uxml.addElementPlusValue(klass, u"fillstyle", self.FillStyle)


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 MovingGroup(fc.Group, MovingObjectMixin, RackUnitPersistanceMixin):
    """
    A moving group object
    """
    ## All we need to do is inherit from:
    ##  Group and MovingObjectMixin
    def __init__(self, *args, **kwargs):
        fc.Group.__init__(self, *args, **kwargs)
        RackUnitPersistanceMixin.__init__(self)


class MovingSimpleRectangle(fc.Rectangle, MovingObjectMixin, PersistMovingSimpleRectMixin):
    """
    Rectangle Object that can be moved, not having a group as a parent
    """
    ## All we need to do is is inherit from:
    ##  Rectangle, MovingObjectMixin
    def __init__(self, *args, **kwargs):
        fc.Rectangle.__init__(self, *args, **kwargs)
        PersistMovingSimpleRectMixin.__init__(self)


class MovingRectangle(fc.Rectangle, MovingObjectMixin, PersistMovingRectMixin):
    """
    Rectangle Object that can be moved, currently used as frame for some modules
    """
    ## All we need to do is is inherit from:
    ##  Rectangle, MovingObjectMixin
    def __init__(self, *args, **kwargs):
        fc.Rectangle.__init__(self, *args, **kwargs)


class MovingCircle(fc.Circle, MovingObjectMixin, PersistMovingCircleMixin):
    """
    Circle Object that can be moved
    """
    ## All we need to do is is inherit from:
    ##  Circle, MovingObjectMixin
    def __init__(self, *args, **kwargs):
        fc.Circle.__init__(self, *args, **kwargs)
        PersistMovingCircleMixin.__init__(self)


class MovingPolygon(fc.Polygon, MovingObjectMixin, PersistMovingPolygonMixin):
    """
    Polygon Object that can be moved
    """
    ## All we need to do is is inherit from:
    ##  Polygon, MovingObjectMixin
    def __init__(self, *args, **kwargs):
        fc.Polygon.__init__(self, *args, **kwargs)
        PersistMovingPolygonMixin.__init__(self)


class MovingPolygonFrame(fc.Polygon, MovingObjectMixin, PersistMovingPolygonFrameMixin):
    """
    Polygon frame Object that can be moved
    """
    ## All we need to do is is inherit from:
    ##  Polygon, MovingObjectMixin
    def __init__(self, *args, **kwargs):
        fc.Polygon.__init__(self, *args, **kwargs)

        
#!/usr/bin/env python

"""
A small demo of how to use Groups of Objects

"""

import wx

# import the installed version
from wx.lib.floatcanvas import NavCanvas, FloatCanvas
import wx.lib.floatcanvas.FloatCanvas as fc


### import a local version
#import sys
#sys.path.append("..")
#from floatcanvas import NavCanvas, FloatCanvas

import rack_utils as rutils

class DrawFrame(wx.Frame):

    """
    A frame used for the FloatCanvas Demo

    """

    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.CreateStatusBar()

        # Add the Canvas
        NC = NavCanvas.NavCanvas(self,-1,
                                     size = (500,500),
                                     ProjectionFun = None,
                                     Debug = 0,
                                     BackgroundColor = "DARK SLATE BLUE",
                                     )
        Canvas = NC.Canvas
        self.Canvas = Canvas

        FloatCanvas.EVT_MOTION(self.Canvas, self.OnMove ) 

        Point = (45,40)

        ## create a few Objects:
        C = FloatCanvas.Circle((0, 0), 10, FillColor="Red")
        R = FloatCanvas.Rectangle((5, 5),(15, 8), FillColor="Blue")
        E = FloatCanvas.Ellipse((1.5, 1.5), (12, 8), FillColor="Purple")
        C2 = FloatCanvas.Circle((0, 5), 10, FillColor="cyan")
        T = FloatCanvas.Text("Group A", (5.5, 5.5), Position="cc", Size = 16, Weight=wx.BOLD, Family=wx.SWISS)

        self.GroupA = FloatCanvas.Group()
        Canvas.AddObject(self.GroupA)
        self.GroupA.AddObject(C2)
        self.GroupA.AddObject(T)
        self.GroupA.AddObject(R)
        self.GroupA.AddObject(C)
        self.GroupA.AddObject(E)

        
        ## create another Groups of objects

        R = FloatCanvas.Rectangle((15, 15),(10, 18), FillColor="orange")
        E = FloatCanvas.Ellipse((22, 28), (12, 8), FillColor="yellow")
        C = FloatCanvas.Circle((25, 20), 15, FillColor="Green")
        C2 = FloatCanvas.Circle((12, 22), 10, FillColor="cyan")
        T = FloatCanvas.Text("Group B", (19, 24), Position="cc", Size = 16, Weight=wx.BOLD, Family=wx.SWISS)

        self.GroupB = FloatCanvas.Group()
        Canvas.AddObject(self.GroupB)
        self.GroupB.AddObjects((R,E,C,C2,T))
       
        self.Groups = {"A":self.GroupA, "B":self.GroupB}
        
        # add another rect to show problem
        self._rackModules = []
        self._rackModulesCount = 0
        
        self.doUnitSingleBottle()

        pr = FloatCanvas.Rectangle((self.getStartPos(), 15),(10, 18), FillColor="yellow")
        Canvas.AddObject(pr)

        # Add a couple of tools to the Canvas Toolbar

        tb = NC.ToolBar
#        tb.AddSeparator()

        for Group in self.Groups.keys():
            Button = wx.Button(tb, wx.ID_ANY, "Hide/Show%s"%Group)
            tb.AddControl(Button)
            print Group
            Button.Bind(wx.EVT_BUTTON, lambda evt, group=Group: self.HideGroup(evt, group))
        tb.Realize()

        self.Show()
        Canvas.ZoomToBB()

    def OnMove(self, event):
        """
        Updates the status bar with the world coordinates of the mouse position

        """
        self.SetStatusText("%.2f, %.2f"%tuple(event.Coords))

    def HideGroup(self, evt, group=""):
        G = self.Groups[group]
        G.Visible = not G.Visible
        self.Canvas.Draw(Force=True)

#added stuff
    def getStartPos(self):
        if self.Canvas.BoundingBoxDirty:
            self.Canvas._ResetBoundingBox()

        bBox = self.Canvas.BoundingBox[1]
        if bBox.IsNull():
            startPos = 0
        else:
            startPos = bBox[0]

        return startPos


    # fake it a bit
    def doUnitSingleBottle(self, rows=5, cols=5, rtype=2, convert=False):
        """a single, double or 'alternatively' stacked bottle rack

        :param int `rows`: number of rows to create
        :param int `cols`: number of columns to create
        :param int `rtype`: see rutils.RACKTYPE* for valid entries
        :param boolean `convert`: convert a v3 rack

        """
        wx.BeginBusyCursor()

        rackUnit = rutils.MovingGroup()
        self.Canvas.AddObject(rackUnit)
        self._rackModules.append(rackUnit)
        self._rackModulesCount += 1

        startPos = self.getStartPos() + 2

        # define start positions
        if rtype == 1:
            startRowPos = -10
            startColPos = startPos -10
            colIncr = 20
        if rtype == 2:
            startRowPos = -10
            startColPos = startPos -10
            startBackRowPos = 0
            startBackColPos = startPos
            colIncr = 20
            doubleSize = 10
        if rtype == 3:
            startRowPos = -20
            startColPos = startPos -20
            startBackRowPos = -5
            startBackColPos = startPos -5
            colIncr = 30
            doubleSize = 20

        if rtype in [2,
                     3]:
            nRows = rows + 1
            nCols = cols
            step = -2
        else:
            nRows = rows
            nCols = cols
            step = -1

        for rowPos in range(nRows, 0, step):
            # create the rows
            startRowPos += colIncr
            actColPos = startColPos

            for colPos in range(nCols):
                actColPos += colIncr
                bot = rutils.MovingCircle((actColPos, startRowPos), 20,
                                   LineColor='blue', LineWidth=2)
        if rtype in [2,
                     3]:
            # double stack
            nRows = rows - 1
            nCols += -1
            for rowPos in range(nRows, 0, step):
                startBackRowPos += colIncr
                actColPos = startBackColPos

                for colPos in range(nCols):
                    actColPos += colIncr
                    bot = rutils.MovingCircle((actColPos, startBackRowPos),
                                       doubleSize, LineColor='red', LineWidth=2)
                    rackUnit.AddObject(bot)


        rackFrame = rutils.MovingPolygonFrame(rackUnit.getOutlinePoints())
        rackUnit.AddObject(rackFrame)
        #self.Canvas.AddObject(rackFrame)
        #rackUnit.Bind(fc.EVT_FC_LEFT_DOWN, self.objectHit)

        self.Canvas.ZoomToBB()
        self.Canvas.Draw(True)

        wx.EndBusyCursor()




app = wx.App(False)
F = DrawFrame(None, title="FloatCanvas Demo App", size=(700,700) )
app.MainLoop()
    
    
    
    









_______________________________________________
FloatCanvas mailing list
[email protected]
http://paulmcnett.com/cgi-bin/mailman/listinfo/floatcanvas

Reply via email to