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 #include <srs_interaction_primitives/plane.h>
00029
00030 using namespace std;
00031 using namespace interactive_markers;
00032 using namespace visualization_msgs;
00033 using namespace geometry_msgs;
00034 using namespace std_msgs;
00035
00036 namespace srs_interaction_primitives
00037 {
00038
00039 Plane::Plane(InteractiveMarkerServerPtr server, string frame_id, string name) :
00040 Primitive(server, frame_id, name, srs_interaction_primitives::PrimitiveType::PLANE)
00041 {
00042 }
00043
00044 void Plane::menuCallback(const InteractiveMarkerFeedbackConstPtr &feedback)
00045 {
00046 MenuHandler::EntryHandle handle = feedback->menu_entry_id;
00047 MenuHandler::CheckState state;
00048 string title;
00049 menu_handler_.getCheckState(handle, state);
00050 menu_handler_.getTitle(handle, title);
00051
00052 updatePublisher_->publishMenuClicked(title, state);
00053
00054 switch (feedback->menu_entry_id)
00055 {
00056 case 1:
00057
00058
00059
00060 if (state == MenuHandler::CHECKED)
00061 {
00062 removeDescriptionControl();
00063 menu_handler_.setCheckState(handle, MenuHandler::UNCHECKED);
00064 }
00065 else
00066 {
00067 description_ = tag_;
00068 addDescriptionControl();
00069 menu_handler_.setCheckState(handle, MenuHandler::CHECKED);
00070 }
00071 break;
00072 case 3:
00073
00074
00075
00076 tag_ = "Unknown";
00077 updatePublisher_->publishTagChanged(tag_);
00078 if (state == MenuHandler::UNCHECKED)
00079 {
00080 menu_handler_.setCheckState(3, MenuHandler::CHECKED);
00081 menu_handler_.setCheckState(4, MenuHandler::UNCHECKED);
00082 menu_handler_.setCheckState(5, MenuHandler::UNCHECKED);
00083 menu_handler_.setCheckState(6, MenuHandler::UNCHECKED);
00084 if (show_description_control_)
00085 {
00086 removeDescriptionControl();
00087 description_ = tag_;
00088 addDescriptionControl();
00089 }
00090 }
00091 break;
00092 case 4:
00093
00094
00095
00096 tag_ = "Wall";
00097 updatePublisher_->publishTagChanged(tag_);
00098 if (state == MenuHandler::UNCHECKED)
00099 {
00100 menu_handler_.setCheckState(3, MenuHandler::UNCHECKED);
00101 menu_handler_.setCheckState(4, MenuHandler::CHECKED);
00102 menu_handler_.setCheckState(5, MenuHandler::UNCHECKED);
00103 menu_handler_.setCheckState(6, MenuHandler::UNCHECKED);
00104 if (show_description_control_)
00105 {
00106 removeDescriptionControl();
00107 description_ = tag_;
00108 addDescriptionControl();
00109 }
00110 }
00111 break;
00112 case 5:
00113
00114
00115
00116 tag_ = "Door";
00117 updatePublisher_->publishTagChanged(tag_);
00118 if (state == MenuHandler::UNCHECKED)
00119 {
00120 menu_handler_.setCheckState(3, MenuHandler::UNCHECKED);
00121 menu_handler_.setCheckState(4, MenuHandler::UNCHECKED);
00122 menu_handler_.setCheckState(5, MenuHandler::CHECKED);
00123 menu_handler_.setCheckState(6, MenuHandler::UNCHECKED);
00124 if (show_description_control_)
00125 {
00126 removeDescriptionControl();
00127 description_ = tag_;
00128 addDescriptionControl();
00129 }
00130 }
00131 break;
00132 case 6:
00133
00134
00135
00136 tag_ = "Table desk";
00137 updatePublisher_->publishTagChanged(tag_);
00138 if (state == MenuHandler::UNCHECKED)
00139 {
00140 menu_handler_.setCheckState(3, MenuHandler::UNCHECKED);
00141 menu_handler_.setCheckState(4, MenuHandler::UNCHECKED);
00142 menu_handler_.setCheckState(5, MenuHandler::UNCHECKED);
00143 menu_handler_.setCheckState(6, MenuHandler::CHECKED);
00144 if (show_description_control_)
00145 {
00146 removeDescriptionControl();
00147 description_ = tag_;
00148 addDescriptionControl();
00149 }
00150 }
00151 break;
00152 }
00153
00154 server_->insert(object_);
00155 menu_handler_.reApply(*server_);
00156 server_->applyChanges();
00157 }
00158
00159 void Plane::createMenu()
00160 {
00161 if (!menu_created_)
00162 {
00163 menu_created_ = true;
00164 menu_handler_.setCheckState(menu_handler_.insert("Show description", boost::bind(&Plane::menuCallback, this, _1)),
00165 MenuHandler::UNCHECKED);
00166 MenuHandler::EntryHandle sub_menu_handle = menu_handler_.insert("Tag");
00167 menu_handler_.setCheckState(
00168 menu_handler_.insert(sub_menu_handle, "Unknown", boost::bind(&Plane::menuCallback, this, _1)),
00169 MenuHandler::UNCHECKED);
00170 menu_handler_.setCheckState(
00171 menu_handler_.insert(sub_menu_handle, "Wall", boost::bind(&Plane::menuCallback, this, _1)),
00172 MenuHandler::UNCHECKED);
00173 menu_handler_.setCheckState(
00174 menu_handler_.insert(sub_menu_handle, "Door", boost::bind(&Plane::menuCallback, this, _1)),
00175 MenuHandler::UNCHECKED);
00176 menu_handler_.setCheckState(
00177 menu_handler_.insert(sub_menu_handle, "Table desk", boost::bind(&Plane::menuCallback, this, _1)),
00178 MenuHandler::UNCHECKED);
00179 }
00180 }
00181
00182 void Plane::create()
00183 {
00184 clearObject();
00185
00186 object_.header.frame_id = frame_id_;
00187 object_.name = name_;
00188
00189 object_.pose = pose_;
00190
00191 mesh_.type = Marker::CUBE;
00192 mesh_.color = color_;
00193 mesh_.scale = scale_;
00194 mesh_.scale.z = 0.001;
00195
00196 control_.always_visible = true;
00197 control_.interaction_mode = InteractiveMarkerControl::BUTTON;
00198 control_.markers.push_back(mesh_);
00199 object_.controls.push_back(control_);
00200
00201 createMenu();
00202 }
00203
00204 void Plane::insert()
00205 {
00206 create();
00207
00208 server_->insert(object_);
00209 menu_handler_.apply(*server_, name_);
00210 }
00211
00212 }