00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <QKeyEvent>
00031
00032 #include <OGRE/OgreRay.h>
00033 #include <OGRE/OgreSceneManager.h>
00034 #include <OGRE/OgreCamera.h>
00035 #include <OGRE/OgreMovableObject.h>
00036 #include <OGRE/OgreRectangle2D.h>
00037 #include <OGRE/OgreSceneNode.h>
00038 #include <OGRE/OgreViewport.h>
00039 #include <OGRE/OgreMaterialManager.h>
00040 #include <OGRE/OgreTexture.h>
00041 #include <OGRE/OgreTextureManager.h>
00042
00043 #include <ros/time.h>
00044
00045 #include "move_tool.h"
00046
00047 #include "rviz/ogre_helpers/camera_base.h"
00048 #include "rviz/ogre_helpers/qt_ogre_render_window.h"
00049 #include "rviz/selection/selection_manager.h"
00050 #include "rviz/visualization_manager.h"
00051 #include "rviz/render_panel.h"
00052 #include "rviz/display.h"
00053 #include "rviz/viewport_mouse_event.h"
00054
00055 #include "selection_tool.h"
00056
00057 namespace rviz
00058 {
00059
00060 SelectionTool::SelectionTool()
00061 : Tool()
00062 , move_tool_( new MoveTool() )
00063 , selecting_( false )
00064 , sel_start_x_( 0 )
00065 , sel_start_y_( 0 )
00066 , moving_( false )
00067 {
00068 name_ = "Select";
00069 shortcut_key_ = 's';
00070 }
00071
00072 SelectionTool::~SelectionTool()
00073 {
00074 delete move_tool_;
00075 }
00076
00077 void SelectionTool::onInitialize()
00078 {
00079 move_tool_->initialize( manager_ );
00080 }
00081
00082 void SelectionTool::activate()
00083 {
00084 manager_->getSelectionManager()->setTextureSize(512);
00085 selecting_ = false;
00086 moving_ = false;
00087 }
00088
00089 void SelectionTool::deactivate()
00090 {
00091 manager_->getSelectionManager()->removeHighlight();
00092 }
00093
00094 void SelectionTool::update(float wall_dt, float ros_dt)
00095 {
00096 SelectionManager* sel_manager = manager_->getSelectionManager();
00097
00098 if (!selecting_)
00099 {
00100 sel_manager->removeHighlight();
00101 }
00102 }
00103
00104 int SelectionTool::processMouseEvent( ViewportMouseEvent& event )
00105 {
00106 SelectionManager* sel_manager = manager_->getSelectionManager();
00107
00108 int flags = 0;
00109
00110 if( event.alt() )
00111 {
00112 moving_ = true;
00113 selecting_ = false;
00114 }
00115 else
00116 {
00117 moving_ = false;
00118
00119 if( event.leftDown() )
00120 {
00121 selecting_ = true;
00122
00123 sel_start_x_ = event.x;
00124 sel_start_y_ = event.y;
00125 }
00126 }
00127
00128 if( selecting_ )
00129 {
00130 sel_manager->highlight( event.viewport, sel_start_x_, sel_start_y_, event.x, event.y );
00131
00132 if( event.leftUp() )
00133 {
00134 SelectionManager::SelectType type = SelectionManager::Replace;
00135
00136 M_Picked selection;
00137
00138 if( event.shift() )
00139 {
00140 type = SelectionManager::Add;
00141 }
00142 else if( event.control() )
00143 {
00144 type = SelectionManager::Remove;
00145 }
00146
00147 sel_manager->select( event.viewport, sel_start_x_, sel_start_y_, event.x, event.y, type );
00148
00149 selecting_ = false;
00150 }
00151
00152 flags |= Render;
00153 }
00154 else if( moving_ )
00155 {
00156 sel_manager->removeHighlight();
00157
00158 flags = move_tool_->processMouseEvent( event );
00159
00160 if( event.type == QEvent::MouseButtonRelease )
00161 {
00162 moving_ = false;
00163 }
00164 }
00165 else
00166 {
00167 sel_manager->highlight( event.viewport, event.x, event.y, event.x, event.y );
00168 }
00169
00170 return flags;
00171 }
00172
00173 int SelectionTool::processKeyEvent( QKeyEvent* event, RenderPanel* panel )
00174 {
00175 SelectionManager* sel_manager = manager_->getSelectionManager();
00176
00177 if( event->key() == Qt::Key_F )
00178 {
00179 sel_manager->focusOnSelection();
00180 }
00181
00182 return Render;
00183 }
00184
00185 }
00186
00187 #include <pluginlib/class_list_macros.h>
00188 PLUGINLIB_DECLARE_CLASS( rviz, Select, rviz::SelectionTool, rviz::Tool )