1 #include "bwm_popup_menu.h"
2 //:
3 // \file
4 
5 #include "bwm_tableau_img.h"
6 #include "bwm_tableau_rat_cam.h"
7 #include "bwm_tableau_generic_cam.h"
8 #include "bwm_tableau_video.h"
9 #include "bwm_tableau_fiducial.h"
10 #include "bwm_command_macros.h"
11 #include "bwm_tableau_mgr.h"
12 
13 //: Use in menus to toggle a parameter
14 class bwm_vertex_toggle_command : public vgui_command
15 {
16  public:
bwm_vertex_toggle_command(bwm_tableau_cam * t,const void * boolref)17   bwm_vertex_toggle_command(bwm_tableau_cam* t, const void* boolref) :
18        tab(t), bref((bool*) boolref) {}
execute()19   void execute() { *bref = !(*bref); tab->observer()->show_vertices(*bref); }
20 
21   bwm_tableau_cam *tab;
22   bool* bref;
23 };
24 
get_menu(vgui_menu & menu)25 void bwm_popup_menu::get_menu(vgui_menu &menu)
26 {
27   // 2D objects submenu
28   vgui_menu submenu;
29 
30   bwm_tableau_img* img_tab = static_cast<bwm_tableau_img* > (tab_.as_pointer());
31   submenu.add("Polygon..",
32               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::create_polygon),
33               vgui_key('g'),  vgui_modifier(vgui_SHIFT) );
34   submenu.separator();
35 
36   submenu.add("PolyLine..",
37               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::create_polyline),
38               vgui_key('l'),  vgui_modifier(vgui_SHIFT) );
39   submenu.separator();
40 
41   submenu.add("Box..",
42               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::create_box),
43               vgui_key('b'), vgui_modifier(vgui_SHIFT) );
44   submenu.separator();
45 
46   submenu.add("Pointset..",
47               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::create_pointset));
48   submenu.separator();
49 
50   submenu.add("Point..",
51               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::create_point),
52               vgui_key('t'), vgui_modifier(vgui_SHIFT) );
53   submenu.separator();
54 
55   submenu.add("Copy..",
56               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::copy),
57               vgui_key('c'), vgui_modifier(vgui_SHIFT) );
58   submenu.separator();
59 
60   submenu.add("Paste..",
61               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::paste),
62               vgui_key('p'), vgui_modifier(vgui_SHIFT) );
63   submenu.separator();
64 
65   vgui_menu poly_draw_menu;
66   poly_draw_menu.add("Polygon...", new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::set_poly_mode));
67   poly_draw_menu.add("Vertex...", new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::set_vertex_mode));
68   submenu.separator();
69 
70   submenu.add("Set Draw Mode", poly_draw_menu);
71   submenu.separator();
72 
73   submenu.add( "Save 2D Spatial Objects (binary)",
74                new vgui_command_simple<bwm_tableau_img>(img_tab, &bwm_tableau_img::save_spatial_objects_2d));
75   submenu.add( "Load 2D Spatial Objects (binary)",
76                new vgui_command_simple<bwm_tableau_img>(img_tab, &bwm_tableau_img::load_spatial_objects_2d));
77   submenu.add( "Save Pointset 2D (ascii)",
78                new vgui_command_simple<bwm_tableau_img>(img_tab,
79                                                         &bwm_tableau_img::save_pointset_2d_ascii));
80   submenu.add( "Load Pointset 2D (ascii)",
81                new vgui_command_simple<bwm_tableau_img>(img_tab,
82                                                         &bwm_tableau_img::load_pointset_2d_ascii));
83   submenu.add( "Print Selected Line Seg",
84                new vgui_command_simple<bwm_tableau_img>(img_tab,
85                                                         &bwm_tableau_img::print_selected_line));
86   submenu.add( "Save vgl line segs 2d (ascii)",
87                new vgui_command_simple<bwm_tableau_img>(img_tab,
88                                                         &bwm_tableau_img::save_lines_vgl_ascii));
89   submenu.add( "Load vgl line segs 2d (ascii)",
90                new vgui_command_simple<bwm_tableau_img>(img_tab,
91                                                         &bwm_tableau_img::load_lines_vgl_ascii));
92   submenu.add( "Load bounding boxes (ascii)",
93              new vgui_command_simple<bwm_tableau_img>(img_tab,
94                                                       &bwm_tableau_img::load_bounding_boxes_2d_ascii));
95   submenu.add( "Load oriented boxes (ascii)",
96                new vgui_command_simple<bwm_tableau_img>(img_tab,
97                                                         &bwm_tableau_img::load_oriented_boxes_2d_ascii));
98   // Delete 2D submenu
99   vgui_menu selmenu;
100   selmenu.add( "Delete Selected",
101                new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::clear_poly),
102                vgui_key('d'), vgui_modifier(vgui_SHIFT));
103   selmenu.separator();
104 
105   selmenu.add( "Delete All",
106                new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::clear_all),
107                vgui_key('a'), vgui_modifier(vgui_SHIFT));
108 
109   selmenu.separator();
110 
111   selmenu.add( "Delete objects on all frames",
112                new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::clear_all_frames) );
113 
114   selmenu.separator();
115 
116   submenu.add( "Delete ", selmenu);
117 
118   menu.add( "2D Objects", submenu);
119   menu.separator();
120 
121   // Image Processing submenu
122   vgui_menu image_submenu;
123 
124   // Add command to run 2D Gauss fit
125   MENU_TAB_ADD_PROCESS("Gauss fit - Subpixel", "gauss process", image_submenu, img_tab);
126 
127   MENU_TAB_ADD_PROCESS("Step Edges VD", "step_edge", image_submenu, img_tab);
128   MENU_TAB_ADD_PROCESS("Detect Lines", "detect_lines", image_submenu, img_tab);
129 
130   image_submenu.add( "Redisplay Edges",
131                      new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::recover_edges),
132                      vgui_key('b'), vgui_modifier(vgui_SHIFT));
133 
134   image_submenu.add( "Redisplay Lines",
135                      new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::recover_lines));
136 
137   image_submenu.add( "Clear Segmentation Display",
138                      new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::clear_box));
139 
140   image_submenu.add( "Crop Image",
141                      new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::crop_image));
142 
143   if (bwm_tableau_mgr::is_registered("bwm_tableau_video"))
144   {
145     vgui_menu mask_menu;
146     mask_menu.add( "Init Mask",
147                    new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::init_mask));
148 
149     mask_menu.add( "Set Change Type",
150                    new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::set_change_type));
151 
152     mask_menu.add( "Add Regions to Mask(selected polygons)",
153                    new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::add_poly_to_mask));
154 
155     mask_menu.add( "Remove Regions from Mask(selected polygons)",
156                    new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::remove_poly_from_mask));
157 
158     //mask_menu.add( "Create Mask Image(bool)",
159     //               new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::create_mask));
160 
161     mask_menu.add( "Save Mask Image",
162                    new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::save_mask));
163 
164     mask_menu.add( "Save Changes(Binary)",
165                    new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::save_changes_binary));
166 
167     mask_menu.add( "Load Changes(Binary)",
168                    new vgui_command_simple<bwm_tableau_img>(img_tab,&bwm_tableau_img::load_changes_binary));
169     image_submenu.add("Mask Ops", mask_menu);
170   }
171   //image_submenu.separator();
172 
173   menu.add("Image Processing", image_submenu);
174   menu.separator();
175 
176   // Image Display submenu
177   vgui_menu img_other;
178 
179   MENU_TAB_ADD_PROCESS("Range Map", "range_map", img_other, img_tab);
180   MENU_TAB_ADD_PROCESS("Intensity Profile", "intensity_profile", img_other, img_tab);
181   MENU_TAB_ADD_PROCESS("Histogram Plot", "histogram", img_other, img_tab);
182 
183   MENU_TAB_ADD_PROCESS("Histogram Plot(Poly)", "histogram_poly", img_other, img_tab);
184 
185   img_other.add( "Show Path" ,
186                  new vgui_command_simple<bwm_tableau_img>(img_tab,
187                                                           &bwm_tableau_img::
188                                                           toggle_show_image_path));
189   img_other.separator();
190   img_other.add( "Zoom to Fit" ,
191                  new vgui_command_simple<bwm_tableau_img>(img_tab,
192                                                           &bwm_tableau_img::
193                                                           zoom_to_fit));
194   img_other.add( "Scroll to Image Location" ,
195                  new vgui_command_simple<bwm_tableau_img>(img_tab,
196                                                           &bwm_tableau_img::
197                                                           scroll_to_point));
198   menu.add("Image Display", img_other);
199 
200 
201   // add more popup menu items based on the tableau type
202   // all camera tableau children will do the following menu items
203   if (tab_->type_name().compare("bwm_tableau_proj_cam")    == 0 ||
204       tab_->type_name().compare("bwm_tableau_rat_cam")     == 0 ||
205       tab_->type_name().compare("bwm_tableau_video")       == 0 ||
206       tab_->type_name().compare("bwm_tableau_generic_cam") == 0)
207   {
208     // 3D Objects menu
209     bwm_tableau_cam* cam_tab = static_cast<bwm_tableau_cam* > (tab_.as_pointer());
210     //might be a generic camera tableau
211     bwm_tableau_generic_cam* gen_tab = nullptr;
212     if (cam_tab->type_name()=="bwm_tableau_generic_cam")
213       gen_tab = static_cast<bwm_tableau_generic_cam* > (tab_.as_pointer());
214 
215     vgui_menu mesh_submenu;
216     std::string on = "[x] ", off = "[ ] ";
217     mesh_submenu.add( ((cam_tab->show_vertices_)?on:off)+"show vertices",
218                       new bwm_vertex_toggle_command(cam_tab, &(cam_tab->show_vertices_)));
219 
220     vgui_menu draw_menu;
221     draw_menu.add("Mesh...", new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_mesh_mode));
222     draw_menu.add("Face...", new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_face_mode));
223     draw_menu.add("Edge...", new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_edge_mode));
224     draw_menu.add("Vertex...", new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_vertex_mode));
225     mesh_submenu.separator();
226 
227     mesh_submenu.add("Set Draw Mode", draw_menu);
228     mesh_submenu.separator();
229 
230     mesh_submenu.add("Load Mesh",
231                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::load_mesh),
232                      vgui_key('m'), vgui_modifier(vgui_SHIFT) );
233     mesh_submenu.separator();
234 
235     mesh_submenu.add("Create Terrain",
236                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::create_terrain),
237                      vgui_key('t'), vgui_modifier(vgui_SHIFT) );
238     mesh_submenu.separator();
239 
240     mesh_submenu.add("Create Mesh Polygon",
241                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::create_polygon_mesh),
242                      vgui_key('p'), vgui_modifier(vgui_SHIFT) );
243     mesh_submenu.separator();
244 
245     mesh_submenu.add("Create Circular Polygon",
246                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::create_circular_polygon),
247                      vgui_key('c'), vgui_modifier(vgui_SHIFT) );
248     mesh_submenu.separator();
249 
250     mesh_submenu.add("Triangulate..",
251                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::triangulate_mesh),
252                      vgui_key('t'), vgui_modifier(vgui_SHIFT));
253     mesh_submenu.separator();
254 
255     mesh_submenu.add( "Create Inner Face",
256                       new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::create_inner_face));
257     mesh_submenu.separator();
258 
259     mesh_submenu.add( "Move Face with Selected Vertex",
260                       new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::move_obj_by_vertex),
261                       vgui_key('m'), vgui_modifier(vgui_SHIFT));
262     mesh_submenu.separator();
263 
264     mesh_submenu.add( "Extrude Face",
265                       new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::extrude_face),
266                       vgui_key('e'), vgui_modifier(vgui_SHIFT));
267     mesh_submenu.separator();
268 
269     mesh_submenu.add( "Divide Face",
270                       new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::divide_face));
271     mesh_submenu.separator();
272 
273     mesh_submenu.add("Scan Regions",
274                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::scan_regions));
275 
276     mesh_submenu.separator();
277 
278     mesh_submenu.add("Set Draw Mode", draw_menu);
279 
280     mesh_submenu.separator();
281 #if 0
282     vgui_menu boxm_submenu;
283 
284     boxm_submenu.add("Create BOXM scene from mesh",
285                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::create_boxm_scene));
286     boxm_submenu.separator();
287     boxm_submenu.add("Load BOXM scene",
288                      new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::load_boxm_scene));
289 
290     mesh_submenu.add("BOXM", boxm_submenu);
291 #endif
292     if (tab_->type_name().compare("bwm_tableau_rat_cam") == 0) {
293       bwm_tableau_rat_cam* rat_cam_tab = static_cast<bwm_tableau_rat_cam* > (tab_.as_pointer());
294       mesh_submenu.separator();
295       mesh_submenu.add( "Center on Geographic Position",
296                         new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
297                         &bwm_tableau_rat_cam::center_pos));
298 
299       mesh_submenu.separator();
300       mesh_submenu.add( "Save Adjusted Camera",
301                         new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
302                         &bwm_tableau_rat_cam::save_adj_camera));
303     }
304     mesh_submenu.separator();
305     mesh_submenu.add( "Toggle GeoPosition Display",
306                       new vgui_command_simple<bwm_tableau_cam>(cam_tab,
307                       &bwm_tableau_cam::show_geo_position));
308 
309     mesh_submenu.separator();
310     mesh_submenu.add( "GeoPosition of Selected Vertex",
311                       new vgui_command_simple<bwm_tableau_cam>(cam_tab,
312                       &bwm_tableau_cam::geo_position_vertex));
313 
314     mesh_submenu.separator();
315     mesh_submenu.add( "Local Position of Selected Vertex",
316                       new vgui_command_simple<bwm_tableau_cam>(cam_tab,
317                       &bwm_tableau_cam::local_position_vertex));
318 
319     // 3D Delete submenu
320     vgui_menu del_menu;
321     del_menu.add( "Delete Selected",
322                   new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::delete_object));
323     del_menu.separator();
324 
325     del_menu.add( "Delete All",
326                   new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::delete_all));
327 
328     mesh_submenu.separator();
329     mesh_submenu.add("Delete", del_menu);
330     menu.separator();
331     menu.add("3D Objects", mesh_submenu);
332     menu.separator();
333     vgui_menu cal_submenu;
334     cal_submenu.add("Set Focal Length(pix)", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::set_focal_length));
335     cal_submenu.add("Set Camera Height (m)", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::set_cam_height));
336     cal_submenu.add("Define Horizon(selected line)", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::set_horizon));
337     cal_submenu.add("Calibrate From Horizon", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::calibrate_cam_from_horizon));
338     cal_submenu.add("Toggle Horizon", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::toggle_cam_horizon));
339     cal_submenu.separator();
340     //cal_submenu.add("Set Ground Plane", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::set_ground_plane));
341     cal_submenu.add("Add Ground Plane", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::add_ground_plane));
342     //cal_submenu.add("Set Sky", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::set_sky));
343     cal_submenu.add("Add Sky", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::add_sky));
344     //cal_submenu.add("Add Vertical Region", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::add_vertical_depth_region));
345     cal_submenu.add("Add Region", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::add_region));
346     cal_submenu.add("Edit Region Properties", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::edit_region_props));
347     cal_submenu.add("Edit Region Weights", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::edit_region_weights));
348     cal_submenu.add("Save Depth Map Scene", new vgui_command_simple<bwm_tableau_cam>(cam_tab, &bwm_tableau_cam::save_depth_map_scene));
349     menu.add("Camera Calibration", cal_submenu);
350   // Registration menu
351     vgui_menu reg_submenu, threed_menu;
352     menu.separator();
353 
354     menu.add( "Set as Master", new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_master));
355 
356     if (gen_tab) {
357       menu.separator();
358       menu.add( "Ray image", new vgui_command_simple<bwm_tableau_generic_cam>(gen_tab,&bwm_tableau_generic_cam::ray_image));
359     }
360     reg_submenu.add( "Set as EO", new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_eo));
361     reg_submenu.separator();
362     reg_submenu.add( "Set as Other Mode", new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_other_mode));
363     reg_submenu.separator();
364 
365     if (tab_->type_name().compare("bwm_tableau_rat_cam") == 0) {
366       bwm_tableau_rat_cam* rat_cam_tab = static_cast<bwm_tableau_rat_cam* > (tab_.as_pointer());
367       reg_submenu.add( "Register Image to World Pt",
368                        new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
369                        &bwm_tableau_rat_cam::adjust_camera_to_world_pt));
370       reg_submenu.separator();
371 
372       reg_submenu.add( "Register to Master",
373                        new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
374                        &bwm_tableau_rat_cam::register_search_to_master));
375       reg_submenu.separator();
376 
377       reg_submenu.add( "Transfer Edges from Master",
378                        new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
379                        &bwm_tableau_rat_cam::project_edges_from_master));
380     }
381     menu.separator();
382     menu.add("Registration", reg_submenu);
383 
384     // Correspondences menu
385     menu.separator();
386     vgui_menu corr_menu;
387     corr_menu.add( "Move (selected)" ,
388                    new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::move_corr));
389     corr_menu.separator();
390 
391     corr_menu.add( "Set Corr to Selected Vertex" ,
392                    new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::set_corr_to_vertex));
393     corr_menu.separator();
394 
395     corr_menu.add( "Save World Point (selected)" ,
396                    new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::world_pt_corr));
397     menu.add( "Image Correspondence", corr_menu);
398 
399     menu.separator();
400     vgui_menu plane_submenu;
401     plane_submenu.add( "Define XY Projection Plane",
402                        new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::define_xy_proj_plane));
403     plane_submenu.separator();
404 
405     plane_submenu.add( "Define YZ Projection Plane",
406                        new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::define_yz_proj_plane));
407     plane_submenu.separator();
408 
409     plane_submenu.add( "Define XZ Projection Plane",
410                        new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::define_xz_proj_plane));
411     plane_submenu.separator();
412 
413     plane_submenu.add( "Selected Face",
414                        new vgui_command_simple<bwm_tableau_cam>(cam_tab,&bwm_tableau_cam::select_proj_plane));
415     menu.add("Projection Plane", plane_submenu);
416 
417     if (tab_->type_name().compare("bwm_tableau_rat_cam") == 0) {
418       bwm_tableau_rat_cam* rat_cam_tab = static_cast<bwm_tableau_rat_cam* > (tab_.as_pointer());
419 
420       menu.separator();
421       vgui_menu lvcs_submenu;
422       //lvcs_submenu.add( "Load LVCS", new bwm_load_lvcs_command(this));
423       //lvcs_submenu.add( "Save LVCS", new bwm_save_lvcs_command(this));
424       lvcs_submenu.add( "Define LVCS",
425                         new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
426         &bwm_tableau_rat_cam::define_lvcs));
427       lvcs_submenu.add( "Adjust Camera to World Point", new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
428                         &bwm_tableau_rat_cam::adjust_camera_offset));
429       lvcs_submenu.separator();
430       lvcs_submenu.add( "Adjust Camera To LVCS",
431                         new vgui_command_simple<bwm_tableau_rat_cam>(rat_cam_tab,
432                         &bwm_tableau_rat_cam::adjust_camera_to_world_pt));
433       menu.add("LVCS", lvcs_submenu);
434     }
435   }
436 
437   // video tableau specific menu items
438   if (tab_->type_name().compare("bwm_tableau_video") == 0)
439   {
440     bwm_tableau_video* video_tab = static_cast<bwm_tableau_video* > (tab_.as_pointer());
441     menu.separator();
442     vgui_menu video_submenu;
443     video_submenu.add( "Play",
444                        new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::play));
445     video_submenu.separator();
446 
447     video_submenu.add( "Stop",
448                        new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::stop));
449     video_submenu.separator();
450 
451     video_submenu.add( "Pause",
452                        new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::pause));
453     video_submenu.separator();
454 
455     video_submenu.add( "Goto Frame",
456                        new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::seek));
457     video_submenu.separator();
458 
459     video_submenu.add( "Next Frame",
460                        new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::next_frame));
461     video_submenu.separator();
462 
463     video_submenu.add( "Previous Frame",
464                        new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::previous_frame));
465 
466     video_submenu.separator();
467 
468     video_submenu.add( "Save as Image List",
469                        new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::save_as_image_list));
470 
471     menu.add("Video", video_submenu);
472     menu.separator();
473 
474     vgui_menu video_corr_submenu;
475     video_corr_submenu.add( "Attach a 3D point",
476                             new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::set_world_pt));
477     video_corr_submenu.separator();
478     video_corr_submenu.add( "Add Match",
479                             new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::add_match));
480     video_corr_submenu.separator();
481 
482     video_corr_submenu.add( "Add Match at Vertex",
483                             new vgui_command_simple<bwm_tableau_video>(video_tab,&bwm_tableau_video::add_match_at_vertex));
484     video_corr_submenu.separator();
485 
486     video_corr_submenu.add( "Remove Selected Corr Match",
487                             new vgui_command_simple<bwm_tableau_video>(video_tab,
488                             &bwm_tableau_video::remove_selected_corr_match));
489     video_corr_submenu.separator();
490 
491     video_corr_submenu.add( "Remove Selected Corr ",
492                             new vgui_command_simple<bwm_tableau_video>(video_tab,
493                             &bwm_tableau_video::remove_selected_corr));
494     video_corr_submenu.separator();
495 
496     video_corr_submenu.add( "Track Selected Corr ",
497                             new vgui_command_simple<bwm_tableau_video>(video_tab,
498                             &bwm_tableau_video::set_selected_corr_for_tracking));
499     video_corr_submenu.separator();
500 
501     video_corr_submenu.add( "Stop Tracking Corr ",
502                             new vgui_command_simple<bwm_tableau_video>(video_tab,
503                             &bwm_tableau_video::unset_selected_corr_for_tracking));
504     video_corr_submenu.separator();
505 
506     video_corr_submenu.add( "Display Corrs at Frame #",
507                             new vgui_command_simple<bwm_tableau_video>(video_tab,
508                             &bwm_tableau_video::display_video_corrs));
509     video_corr_submenu.separator();
510 
511     video_corr_submenu.add( "Display Corrs on Current Frame",
512                             new vgui_command_simple<bwm_tableau_video>(video_tab,
513                             &bwm_tableau_video::display_current_video_corrs));
514     video_corr_submenu.separator();
515 
516     video_corr_submenu.add( "Clear Corr Display",
517                             new vgui_command_simple<bwm_tableau_video>(video_tab,
518                             &bwm_tableau_video::clear_video_corrs_display));
519     video_corr_submenu.separator();
520 
521     video_corr_submenu.add( "Toggle Correspondence Display (All Frames)",
522                             new vgui_command_simple<bwm_tableau_video>(video_tab,
523                             &bwm_tableau_video::toggle_corr_display));
524     video_corr_submenu.separator();
525     video_corr_submenu.add( "Toggle World Point Display (if corrs displayed)",
526                             new vgui_command_simple<bwm_tableau_video>(video_tab,
527                             &bwm_tableau_video::toggle_world_pt_display));
528     video_corr_submenu.separator();
529     video_corr_submenu.add( "Project Selected World Point",
530                             new vgui_command_simple<bwm_tableau_video>(video_tab,
531                             &bwm_tableau_video::display_selected_world_pt));
532     video_corr_submenu.separator();
533 
534     video_corr_submenu.add( "Extract World Plane",
535                             new vgui_command_simple<bwm_tableau_video>(video_tab,
536                             &bwm_tableau_video::extract_world_plane));
537 
538     video_corr_submenu.separator();
539 
540     video_corr_submenu.add( "Extract Neighborhoods",
541                             new vgui_command_simple<bwm_tableau_video>(video_tab,
542                             &bwm_tableau_video::extract_neighborhoods));
543 
544     video_corr_submenu.separator();
545 
546     video_corr_submenu.add( "Extract Histograms",
547                             new vgui_command_simple<bwm_tableau_video>(video_tab,
548                             &bwm_tableau_video::extract_histograms));
549     menu.add("Video Correspondence", video_corr_submenu);
550   }
551 
552 if (tab_->type_name().compare("bwm_tableau_fiducial")    == 0){
553   bwm_tableau_fiducial* fid_tab = static_cast<bwm_tableau_fiducial* > (tab_.as_pointer());
554   menu.separator();
555   vgui_menu corr_menu;
556   corr_menu.add( "enable fiducial corrs",
557                  new vgui_command_simple<bwm_tableau_fiducial>(fid_tab,&bwm_tableau_fiducial::enable_fid_corrs));
558   corr_menu.add( "disable fiducial corrs",
559                  new vgui_command_simple<bwm_tableau_fiducial>(fid_tab,&bwm_tableau_fiducial::disable_fid_corrs));
560   corr_menu.add( "save fiducial corrs",
561                  new vgui_command_simple<bwm_tableau_fiducial>(fid_tab,&bwm_tableau_fiducial::save_fiducial_corrs));
562     menu.add( "Fiducial Correspondence", corr_menu);
563  }
564 }
565