当使用uicontextmenu得到位置

12个视图(30天)
卢卡Amerio”class=
卢卡Amerio 2019年10月15日
编辑: 亚当Danz 2019年10月16日
我想代码一个接口,在船底的用户执行一些操作可视化为散点图的点的集合。
要做到这一点,我想我可以使用快捷菜单,用户可以右键点击一个点和决定要做什么操作的列表。
然而使用uicontextmenu时,我不能得到和处理的家长,也的位置(或索引)用户点击。
考虑一下这个例子
函数测试()
x = randn (20);
y = randn (20);
菜单= uicontextmenu ();
hs =散射(x, y,“UIContextMenu”、菜单);
uimenu(菜单,“标签”,做一些与此点的,“回调”@something)
结束
函数evnt东西(src)
流(“x = % f, y = % f ',x, y)
结束
我知道一个解决方法是通过父函数调用
uimenu(菜单,“标签”,做一些与此点的,“回调”,{@something, hs})
和定义
函数的东西(src、evnt、父母)
流(“% s \ n”、类(父)
结束
但这并不能帮助我理解用户点击,作为输入定义的“东西”就是在创造ans src, evnt不包含我要找的信息。
有解决方案吗?

接受的答案

亚当Danz”class=
亚当Danz 2019年10月15日
编辑:亚当Danz 2019年10月16日
而不是一个上下文菜单,使用 ButtonDownFcn 响应鼠标点击的对象。更轻的重量比一个上下文菜单,只需要1点击,而不是一个右键单击+选择。
这是一个演示使用你的想法:它输出(x, y)坐标到命令窗口和标志着最近选择配合一个红色的 x ”。 hObj 是你点击处理线对象。 eventM 是一个结构,其中包含您所选择的点的坐标和按钮用于选择它。
x = randn (20);
y = randn (20);
% = uicontextmenu菜单();
hs =散射(x, y);
海关。ButtonDownFcn = @clickPointFcn;
持有
函数clickPointFcn (hObj、事件)
%与....做任何你想做的
流(“x = % f, y = f % \ n 'event.IntersectionPoint (1:2))
搜索和删除之前的最近选择的百分比
删除(findall (hObj.Parent“标签”,“recentSelection”))
%添加“x”标记的选择
情节(event.IntersectionPoint (1) event.IntersectionPoint (2),“处方”,“标签”,“recentSelection”)
结束
2的评论
亚当Danz”class=
亚当Danz 2019年10月16日
编辑:亚当Danz 2019年10月16日
每个数据点对应于一个ID和我想我点击的ID ”。
这是相当容易的。下面是我的建议的3 d版本和ButtonDownFcn返回的3 d坐标和索引值。hObj输入线的处理对象和包含所有的x, y, z坐标。事件输入包含x0, y0, z0坐标点你的点击。找到其索引你只是寻找这些值的对象处理。
同样,只是为了让事情变得更复杂,我工作在3 d,所以即使“寻找给定的点的坐标”是混乱的 因为ButtonDownFcn将返回投影点用户点击,而不是真正的点 ”。
不,它返回选中的点的坐标,不是光标的坐标。说服自己,情节单一与一个非常大的协调markersize并单击标记内的任何位置。它将返回相同的值。所以不需要卡西任何数组或考虑视图方向。
hs = plot3 (1、2、3,“o”,“MarkerSize”,80,“ButtonDownFcn”,@clickPointFcn);
我觉得让一个点根据用户点击是“危险的”,因为可能有多个点重叠或对齐,
这是一个有效的担忧,但你会有同样的问题和你的上下文菜单的想法。如果两个点是完全重叠,没有办法选择只是其中之一。如果他们而他重叠可以缩放或旋转情节来最大化他们的分离。这就是为什么我给了一个例子,一个红色的x添加到选定的标记,这样用户会反馈他的选择。在完全重叠点的情况下,你可以做一个小修改下面的示例代码返回所有的选择而不是一个点。
3 d与索引返回的例子
x = randn (20);
y = randn (20);
z = randn (20);
% = uicontextmenu菜单();
hs = scatter3 (x, y, z);
网格
海关。ButtonDownFcn = @clickPointFcn;
持有
函数clickPointFcn (hObj、事件)
%的指数选择的坐标
allCoord = [hObj.XData (:), hObj.YData (:), hObj.ZData (:));
[~,idx] = min(总和(abs (allCoord - event.IntersectionPoint), 2));
%与....做任何你想做的
流(' x = % f, y = % f、z = f %, idx = % .0f \ n '(event.IntersectionPoint idx])
搜索和删除之前的最近选择的百分比
删除(findall (hObj.Parent“标签”,“recentSelection”))
%添加“x”标记的选择
event.IntersectionPoint plot3 (event.IntersectionPoint (1) (2), event.IntersectionPoint (3),“处方”,“标签”,“recentSelection”)

登录置评。

答案(1)

亚当”class=
亚当 2019年10月15日
我使用下面这样的代码位置上下文菜单下的光标在一个轴,但如果你已经准备好了你所需要的图处理是第二行给你你的当前位置。就我而言我只是将这个值设置为“位置”上下文菜单的属性,但你可以使用它为任何目的的愿望。
hFig =祖先(hax,“图”);
hFig.CurrentPoint;
这将给图的位置,但轴也有一个“CurrentPoint”属性,我认为会给你当前轴坐标点。我不记得我的头顶,我不这样做,并使用图示例 CurrentPoint 代替。

类别

找到更多的在交互控制和回调帮助中心文件交换

s manbetx 845


释放

R2018b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!