@@ -166,6 +166,7 @@ def __init__(self, signal_provider, meshcat_provider, animation_period):
166
166
self .video_items = []
167
167
self .visualized_3d_points = set ()
168
168
self .visualized_3d_trajectories = set ()
169
+ self .visualized_3d_arrows = set ()
169
170
self .visualized_3d_points_colors_palette = ColorPalette ()
170
171
171
172
self .toolButton_on_click ()
@@ -731,8 +732,10 @@ def variableTreeWidget_on_right_click(self, item_position):
731
732
732
733
add_3d_point_str = "Show as a 3D point"
733
734
add_3d_trajectory_str = "Show as a 3D trajectory"
735
+ add_3d_arrow_str = "Show as a 3D arrow"
734
736
remove_3d_point_str = "Remove the 3D point"
735
737
remove_3d_trajectory_str = "Remove the 3D trajectory"
738
+ remove_3d_arrow_str = "Remove the 3D arrow"
736
739
use_as_base_position_str = "Use as base position"
737
740
use_as_base_orientation_str = "Use as base orientation"
738
741
dont_use_as_base_position_str = "Don't use as base position"
@@ -784,14 +787,24 @@ def variableTreeWidget_on_right_click(self, item_position):
784
787
else :
785
788
menu .addAction (use_as_base_orientation_str + " (xyzw Quaternion)" )
786
789
790
+ if item_size == 6 :
791
+ if item_key in self .visualized_3d_arrows :
792
+ menu .addAction (remove_3d_arrow_str )
793
+ else :
794
+ menu .addAction (add_3d_arrow_str )
795
+
787
796
# show the menu
788
797
action = menu .exec_ (self .ui .variableTreeWidget .mapToGlobal (item_position ))
789
798
if action is None :
790
799
return
791
800
792
801
item_path = self .get_item_path (item )
793
802
794
- if action .text () == add_3d_point_str or action .text () == add_3d_trajectory_str :
803
+ if (
804
+ action .text () == add_3d_point_str
805
+ or action .text () == add_3d_trajectory_str
806
+ or action .text () == add_3d_arrow_str
807
+ ):
795
808
color = next (self .visualized_3d_points_colors_palette )
796
809
797
810
item .setForeground (0 , QtGui .QBrush (QtGui .QColor (color .as_hex ())))
@@ -802,12 +815,20 @@ def variableTreeWidget_on_right_click(self, item_position):
802
815
)
803
816
self .signal_provider .register_3d_point (item_key , item_path )
804
817
self .visualized_3d_points .add (item_key )
805
- else :
818
+ elif action . text () == add_3d_trajectory_str :
806
819
self .meshcat_provider .register_3d_trajectory (
807
820
item_key , list (color .as_normalized_rgb ())
808
821
)
809
822
self .signal_provider .register_3d_trajectory (item_key , item_path )
810
823
self .visualized_3d_trajectories .add (item_key )
824
+ elif action .text () == add_3d_arrow_str :
825
+ self .meshcat_provider .register_3d_arrow (
826
+ item_key , list (color .as_normalized_rgb ())
827
+ )
828
+ self .signal_provider .register_3d_arrow (item_key , item_path )
829
+ self .visualized_3d_arrows .add (item_key )
830
+ else :
831
+ raise ValueError ("Unknown action" )
811
832
812
833
if action .text () == remove_3d_point_str :
813
834
self .meshcat_provider .unregister_3d_point (item_key )
@@ -821,6 +842,12 @@ def variableTreeWidget_on_right_click(self, item_position):
821
842
self .visualized_3d_trajectories .remove (item_key )
822
843
item .setForeground (0 , QtGui .QBrush (QtGui .QColor (0 , 0 , 0 )))
823
844
845
+ if action .text () == remove_3d_arrow_str :
846
+ self .meshcat_provider .unregister_3d_arrow (item_key )
847
+ self .signal_provider .unregister_3d_arrow (item_key )
848
+ self .visualized_3d_arrows .remove (item_key )
849
+ item .setForeground (0 , QtGui .QBrush (QtGui .QColor (0 , 0 , 0 )))
850
+
824
851
if (
825
852
use_as_base_orientation_str in action .text ()
826
853
or action .text () == use_as_base_position_str
0 commit comments