menu.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 """
4 Copyright (c) 2011, Willow Garage, Inc.
5 All rights reserved.
6 
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9 
10  * Redistributions of source code must retain the above copyright
11  notice, this list of conditions and the following disclaimer.
12  * Redistributions in binary form must reproduce the above copyright
13  notice, this list of conditions and the following disclaimer in the
14  documentation and/or other materials provided with the distribution.
15  * Neither the name of the Willow Garage, Inc. nor the names of its
16  contributors may be used to endorse or promote products derived from
17  this software without specific prior written permission.
18 
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 POSSIBILITY OF SUCH DAMAGE.
30 """
31 
32 from __future__ import print_function
33 
34 import rospy
35 
38 from visualization_msgs.msg import *
39 
40 server = None
41 marker_pos = 0
42 
43 menu_handler = MenuHandler()
44 
45 h_first_entry = 0
46 h_mode_last = 0
47 
48 def enableCb( feedback ):
49  handle = feedback.menu_entry_id
50  state = menu_handler.getCheckState( handle )
51 
52  if state == MenuHandler.CHECKED:
53  menu_handler.setCheckState( handle, MenuHandler.UNCHECKED )
54  rospy.loginfo("Hiding first menu entry")
55  menu_handler.setVisible( h_first_entry, False )
56  else:
57  menu_handler.setCheckState( handle, MenuHandler.CHECKED )
58  rospy.loginfo("Showing first menu entry")
59  menu_handler.setVisible( h_first_entry, True )
60 
61  menu_handler.reApply( server )
62  rospy.loginfo("update")
63  server.applyChanges()
64 
65 def modeCb(feedback):
66  global h_mode_last
67  menu_handler.setCheckState( h_mode_last, MenuHandler.UNCHECKED )
68  h_mode_last = feedback.menu_entry_id
69  menu_handler.setCheckState( h_mode_last, MenuHandler.CHECKED )
70 
71  rospy.loginfo("Switching to menu entry #" + str(h_mode_last))
72  menu_handler.reApply( server )
73  print("DONE")
74  server.applyChanges()
75 
76 def makeBox( msg ):
77  marker = Marker()
78 
79  marker.type = Marker.CUBE
80  marker.scale.x = msg.scale * 0.45
81  marker.scale.y = msg.scale * 0.45
82  marker.scale.z = msg.scale * 0.45
83  marker.color.r = 0.5
84  marker.color.g = 0.5
85  marker.color.b = 0.5
86  marker.color.a = 1.0
87 
88  return marker
89 
90 def makeBoxControl( msg ):
91  control = InteractiveMarkerControl()
92  control.always_visible = True
93  control.markers.append( makeBox(msg) )
94  msg.controls.append( control )
95  return control
96 
97 def makeEmptyMarker( dummyBox=True ):
98  global marker_pos
99  int_marker = InteractiveMarker()
100  int_marker.header.frame_id = "base_link"
101  int_marker.pose.position.y = -3.0 * marker_pos
102  marker_pos += 1
103  int_marker.scale = 1
104  return int_marker
105 
106 def makeMenuMarker( name ):
107  int_marker = makeEmptyMarker()
108  int_marker.name = name
109 
110  control = InteractiveMarkerControl()
111 
112  control.interaction_mode = InteractiveMarkerControl.BUTTON
113  control.always_visible = True
114 
115  control.markers.append( makeBox( int_marker ) )
116  int_marker.controls.append(control)
117 
118  server.insert( int_marker )
119 
120 def deepCb( feedback ):
121  rospy.loginfo("The deep sub-menu has been found.")
122 
123 def initMenu():
124  global h_first_entry, h_mode_last
125  h_first_entry = menu_handler.insert( "First Entry" )
126  entry = menu_handler.insert( "deep", parent=h_first_entry)
127  entry = menu_handler.insert( "sub", parent=entry );
128  entry = menu_handler.insert( "menu", parent=entry, callback=deepCb );
129 
130  menu_handler.setCheckState( menu_handler.insert( "Show First Entry", callback=enableCb ), MenuHandler.CHECKED )
131 
132  sub_menu_handle = menu_handler.insert( "Switch" )
133  for i in range(5):
134  s = "Mode " + str(i)
135  h_mode_last = menu_handler.insert( s, parent=sub_menu_handle, callback=modeCb )
136  menu_handler.setCheckState( h_mode_last, MenuHandler.UNCHECKED)
137  # check the very last entry
138  menu_handler.setCheckState( h_mode_last, MenuHandler.CHECKED )
139 
140 if __name__=="__main__":
141  rospy.init_node("menu")
142 
143  server = InteractiveMarkerServer("menu")
144 
145  initMenu()
146 
147  makeMenuMarker( "marker1" )
148  makeMenuMarker( "marker2" )
149 
150  menu_handler.apply( server, "marker1" )
151  menu_handler.apply( server, "marker2" )
152  server.applyChanges()
153 
154  rospy.spin()
155 
menu.enableCb
def enableCb(feedback)
Definition: menu.py:48
menu.deepCb
def deepCb(feedback)
Definition: menu.py:120
menu.initMenu
def initMenu()
Definition: menu.py:123
menu.makeBoxControl
def makeBoxControl(msg)
Definition: menu.py:90
menu.makeMenuMarker
def makeMenuMarker(name)
Definition: menu.py:106
interactive_markers::interactive_marker_server::InteractiveMarkerServer
msg
menu.makeBox
def makeBox(msg)
Definition: menu.py:76
interactive_markers::menu_handler::MenuHandler
interactive_markers::interactive_marker_server
menu.makeEmptyMarker
def makeEmptyMarker(dummyBox=True)
Definition: menu.py:97
interactive_markers::menu_handler
menu.modeCb
def modeCb(feedback)
Definition: menu.py:65


interactive_marker_tutorials
Author(s): David Gossow
autogenerated on Wed Mar 2 2022 01:13:07