laser_drawing_area.h

00001
00002 /***************************************************************************
00003  *  laser_drawing_area.h - Laser drawing area derived from Gtk::DrawingArea
00004  *
00005  *  Created: Thu Oct 09 18:19:54 2008
00006  *  Copyright  2008  Tim Niemueller [www.niemueller.de]
00007  *
00008  ****************************************************************************/
00009
00010 /*  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; either version 2 of the License, or
00013  *  (at your option) any later version.
00014  *
00015  *  This program is distributed in the hope that it will be useful,
00016  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  *  GNU Library General Public License for more details.
00019  *
00020  *  Read the full text in the LICENSE.GPL file in the doc directory.
00021  */
00022
00023 #ifndef __TOOLS_LASERGUI_LASER_DRAWING_AREA_H_
00024 #define __TOOLS_LASERGUI_LASER_DRAWING_AREA_H_
00025 
00026 #include <gtkmm.h>
00027 #include <libglademm/xml.h>
00028 #include <list>
00029 #include <interfaces/Position2DTrackInterface.h>
00030 #include <interfaces/SwitchInterface.h>
00031
00032 namespace fawkes {
00033   class Laser360Interface;
00034   class Laser720Interface;
00035   class ObjectPositionInterface;
00036   class CairoRobotDrawer;
00037   class LegtrackerTrackinterface;
00038   class SwitchInterface;
00039 }
00040
00041 class LaserDrawingArea
00042   : public Gtk::DrawingArea
00043 {
00044  public:
00045   /** Draw modes. */
00046   typedef enum {
00047     MODE_LINES,         /**< Draw beams as lines */
00048     MODE_POINTS,        /**< Only draw beam end points */
00049     MODE_HULL           /**< Draw hull of beams */
00050   } draw_mode_t;
00051
00052   LaserDrawingArea();
00053   LaserDrawingArea(BaseObjectType* cobject,
00054                    const Glib::RefPtr<Gnome::Glade::Xml>& refxml);
00055
00056   void set_laser360_if(fawkes::Laser360Interface *laser_if);
00057   void set_laser720_if(fawkes::Laser720Interface *laser_if);
00058   void reset_laser_ifs();
00059   void set_objpos_if(std::list<fawkes::ObjectPositionInterface*>* l_objpos_if_persons,
00060                      std::list<fawkes::ObjectPositionInterface*>* l_objpos_if_legs,
00061                      std::list<fawkes::ObjectPositionInterface*>* l_objpos_if_misc,
00062                      fawkes::Laser720Interface* laser_segmentation_if,
00063                      std::list<fawkes::Position2DTrackInterface*>* l_track_if,
00064                      fawkes::ObjectPositionInterface* target_if,
00065                      fawkes::SwitchInterface* switch_if);
00066   void set_line_if(fawkes::ObjectPositionInterface *line_if);
00067   void set_robot_drawer(fawkes::CairoRobotDrawer *robot_drawer);
00068   void set_resolution(unsigned int resolution);
00069
00070   void zoom_in();
00071   void zoom_out();
00072
00073   void set_rotation(float rot_rad);
00074   void set_draw_mode(draw_mode_t mode);
00075
00076   void toggle_break_drawing();
00077
00078  protected:
00079   virtual bool on_expose_event(GdkEventExpose* event);
00080   virtual bool on_scroll_event(GdkEventScroll *event);
00081   virtual bool on_motion_notify_event(GdkEventMotion *event);
00082   virtual bool on_button_press_event(GdkEventButton *event);
00083
00084   void draw_beams(Glib::RefPtr<Gdk::Window> &window,
00085                   Cairo::RefPtr<Cairo::Context> &cr);
00086   void draw_segments(Glib::RefPtr<Gdk::Window> &window,
00087                      Cairo::RefPtr<Cairo::Context> &cr);
00088   void draw_scalebox(Glib::RefPtr<Gdk::Window> &window,
00089                      Cairo::RefPtr<Cairo::Context> &cr);
00090   void draw_persons_legs(Glib::RefPtr<Gdk::Window> &window,
00091                          Cairo::RefPtr<Cairo::Context> &cr);
00092   std::pair<float,float> transform_coords_from_fawkes(float p_x, float p_y);
00093
00094
00095  private:
00096   fawkes::Laser360Interface *__laser360_if;
00097   fawkes::Laser720Interface *__laser720_if;
00098   fawkes::Laser720Interface *__laser_segmentation_if;
00099   fawkes::SwitchInterface           *__switch_if;
00100   fawkes::ObjectPositionInterface           *__target_if;
00101
00102   fawkes::ObjectPositionInterface *__line_if;
00103
00104   std::list<fawkes::ObjectPositionInterface*>* __l_objpos_if_persons;
00105   std::list<fawkes::ObjectPositionInterface*>* __l_objpos_if_legs;
00106   std::list<fawkes::ObjectPositionInterface*>* __l_objpos_if_misc;
00107   std::list<fawkes::Position2DTrackInterface*>* __l_track_if;
00108
00109   draw_mode_t                __draw_mode;
00110
00111   float                      __zoom_factor;
00112   unsigned int               __resolution;
00113   float                      __rotation;
00114   bool                       __break_drawing;
00115   bool                       __first_draw;
00116   double __last_mouse_x;
00117   double __last_mouse_y;
00118   double __xc;
00119   double __yc;
00120
00121   fawkes::CairoRobotDrawer  *__robot_drawer;
00122 };
00123
00124 #endif