From 69305ae1ed6da084b6ee65dba3ce44f0d6cbe2d1 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Thu, 30 Apr 2009 09:53:44 +0200 Subject: * host/simu, digital/io/tools: - new simulation infrastructure. --- host/simu/inter/inter.py | 127 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 host/simu/inter/inter.py (limited to 'host/simu/inter/inter.py') diff --git a/host/simu/inter/inter.py b/host/simu/inter/inter.py new file mode 100644 index 00000000..b8a889e5 --- /dev/null +++ b/host/simu/inter/inter.py @@ -0,0 +1,127 @@ +# simu - Robot simulation. {{{ +# +# Copyright (C) 2009 Nicolas Schodet +# +# APBTeam: +# Web: http://apbteam.org/ +# Email: team AT apbteam DOT org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# }}} +"""Simulation interface.""" +from simu.inter.drawable import * +from Tkinter import * + +class TableView (DrawableCanvas): + """This class handle the view of the table and every items inside it.""" + + TABLE_WIDTH = 3000 + TABLE_HEIGHT = 2100 + MARGIN = 150 + + def __init__ (self, master = None, + width = TABLE_WIDTH, height = TABLE_HEIGHT): + DrawableCanvas.__init__ (self, + width + 2 * self.MARGIN, height + 2 * self.MARGIN, + -width / 2, -height / 2, + master, borderwidth = 1, relief = 'sunken', + background = 'white') + +class ActuatorView (DrawableCanvas): + """This class handle the view of the actuators inside the robot.""" + + UNIT = 120 + + def __init__ (self, master = None): + DrawableCanvas.__init__ (self, 1, 1, 0, 0, master, + borderwidth = 1, relief = 'sunken', background = 'white') + self.configure (width = self.UNIT, height = self.UNIT) + self.size = 0.0 + + def add_view (self, width = 1.0, height = 1.0): + """Return a drawable suitable for an actuator view.""" + ratio = float (height) / float (width) + self.size += ratio + self.resize (1, self.size, 0, self.size / 2) + self.configure (width = self.UNIT, height = self.UNIT * self.size) + d = Drawable (self) + d.trans_scale (1.0 / width) + d.trans_translate ((0, - self.size + ratio / 2)) + return d + +class Inter (Frame): + """Robot simulation interface.""" + + def __init__ (self, master = None): + Frame.__init__ (self, master) + self.pack (expand = True, fill = 'both') + self.create_widgets () + + def create_widgets (self): + # Main layout. + self.right_frame = Frame (self) + self.right_frame.pack (side = 'right', fill = 'y') + self.quit_button = Button (self.right_frame, text = 'Quit', + command = self.quit) + self.quit_button.pack (side = 'top') + # Actuator view. + self.actuator_view = ActuatorView (self.right_frame) + self.actuator_view.pack (side = 'bottom', fill = 'x') + # Sensor frame. + self.sensor_frame = Frame (self.right_frame, borderwidth = 1, + relief = 'sunken') + self.sensor_frame.pack (side = 'bottom', fill = 'x') + # Table view. + self.table_view = TableView (self) + self.table_view.pack (expand = True, fill = 'both') + + def update (self, *args): + self.table_view.update () + self.actuator_view.update () + +if __name__ == '__main__': + class TestTable (Drawable): + def __init__ (self, onto, w, h): + Drawable.__init__ (self, onto) + self.w, self.h = w, h + def draw (self): + self.reset () + w, h = self.w, self.h + self.draw_rectangle ((0, 0), (w, h), fill = 'blue') + Drawable.draw (self) + class TestRectangle (Drawable): + def __init__ (self, onto, w, h, c1, c2): + Drawable.__init__ (self, onto) + self.w, self.h = 0.9 * w, 0.9 * h + self.c1, self.c2 = c1, c2 + def draw (self): + self.reset () + w, h = self.w, self.h + self.draw_rectangle ((-w/2, -h/2), (w/2, h/2), fill = self.c1) + self.draw_rectangle ((0, 0), (w/2, h/2), fill = self.c2) + Drawable.draw (self) + class TestSensor: + def __init__ (self, master): + self.button = Checkbutton (master, text = 'Sensor', + indicatoron = False) + self.button.pack (side = 'top') + app = Inter () + TestTable (app.table_view, 3000, 2100) + TestRectangle (app.actuator_view.add_view (1, 1), 1, 1, 'red', 'green') + TestRectangle (app.actuator_view.add_view (2, 1), 2, 1, 'green', 'blue') + TestRectangle (app.actuator_view.add_view (1, 2), 1, 2, 'blue', 'red') + TestSensor (app.sensor_frame) + app.mainloop () -- cgit v1.2.3