# Raumplaner.py import wx import colorsys from math import cos, sin, radians USE_BUFFER = ('wxMSW' in wx.PlatformInfo) # use buffered drawing on Windows class TestPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.Bind(wx.EVT_PAINT, self.OnPaint) if USE_BUFFER: self.Bind(wx.EVT_SIZE, self.OnSize) self.objekte = [] self.anzahl = 0 self.gc = None def OnSize(self, evt): self.InitBuffer() evt.Skip() def OnPaint(self, evt): if USE_BUFFER: # The buffer already contains our drawing, so no need to # do anything else but create the buffered DC. When this # method exits and dc is collected then the buffer will be # blitted to the paint DC automagically dc = wx.BufferedPaintDC(self, self._buffer) else: # Otherwise we need to draw our content to the paint DC at # this time. dc = wx.PaintDC(self) gc = self.MakeGC(dc) self.Draw(gc) def InitBuffer(self): sz = self.GetClientSize() sz.width = max(1, sz.width) sz.height = max(1, sz.height) self._buffer = wx.EmptyBitmap(sz.width, sz.height, 32) dc = wx.MemoryDC(self._buffer) dc.SetBackground(wx.Brush("WHITE")) # Original:self.GetBackgroundColour() dc.Clear() gc = self.MakeGC(dc) self.Draw(gc) def MakeGC(self, dc): try: gc = wx.GraphicsContext.Create(dc) except NotImplementedError: dc.DrawText("This build of wxPython does not support the wx.GraphicsContext " "family of classes.", 25, 25) return None self.gc = gc return gc def Draw(self, gc): font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetWeight(wx.BOLD) gc.SetFont(font, wx.BLACK) # wird ignoriert # make a path that contains a circle and some lines, centered at 0,0 for objekt in self.objekte: path = gc.CreatePath() ### Das geht so nicht, da es kein append gibt! ### Also muss die Klasse Tisch den gc kennen und zu seinem Shape einen fertigen Pfad erzeugen. ### der kann mit AddPath angehängt werden. path.AddPath(objekt.GibFigur()) gc.SetPen(wx.Pen(objekt.farbe)) gc.StrokePath(path) # ohne Füllung # Erweiterungen für das Raumplanerprojekt: def Zeichne(self, objekt): self.objekte+=[objekt] def GibGC(self): return self.gc class Fenster(wx.Frame): """ Die Klasse Fenster erzeugt einen Frame. """ def __init__(self, parent, title): wx.Frame.__init__(self, parent, -1, title, pos=(50, 50), size=(400, 400)) self.panel = TestPanel(self) def GibZeichenflaeche(self): return self.panel class Tisch: def __init__(self, fenster, x, y, breite, tiefe): self.fenster = fenster self.x = x self.y = y self.breite = breite self.tiefe = tiefe self.farbe = "RED" def GibFigur(self): panel = self.fenster.GibZeichenflaeche() path = panel.GibGC().CreatePath() path.AddRectangle(self.x, self.y, self.breite, self.tiefe) return path def Zeichne(self): self.fenster.GibZeichenflaeche().Zeichne(self) class MyApp(wx.App): def OnInit(self): frame = Fenster(None, "Grafik") self.SetTopWindow(frame) tisch1 = Tisch(frame, 10, 10, 100, 60) tisch1.Zeichne() tisch2 = Tisch(frame, 110, 160, 100, 60) tisch2.Zeichne() frame.Show(True) return True app = MyApp(redirect=False) # Parameterwert True, wenn Ausgaben in der Standard E/A angezeigt werden sollen app.MainLoop()