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