Matlab如何通过ButtonDownFcn存储多次点击绘图线条的索引到工作区
Matlab点击线条累计存储索引解决方案
你的代码单次覆盖的核心原因是每次触发点击事件时直接写入新值到工作区变量,没有读取已有历史值做追加,以下是两种可直接使用的实现方案:
方案1:直接基于工作区变量累加
该方案无需额外调整原有调用逻辑,仅修改回调函数即可:
set(H, 'ButtonDownFcn', {@LineSelected, H}) function LineSelected(ObjectH, ~, H) set(ObjectH, 'LineWidth', 4); set(H(H ~= ObjectH), 'LineWidth', 2); % 按需选择要存储的内容,二选一即可 % 选项A:存储线条在H数组中的索引序号 stored_val = find(H == ObjectH); % 选项B:存储线条的X坐标值(替换上面一行即可) % stored_val = ObjectH.XData(1); % 读取已有历史值,追加后回写 if evalin('base', 'exist(''IndInWorkSpace'', ''var'')') IndInWorkSpace = evalin('base', 'IndInWorkSpace'); IndInWorkSpace(end+1) = stored_val; else IndInWorkSpace = stored_val; end assignin('base','IndInWorkSpace',IndInWorkSpace); end
如需清空历史记录,在命令行执行clear IndInWorkSpace即可。
方案2:基于Figure内置存储的更稳妥实现
该方案将历史记录存在Figure对象的内置存储区,避免工作区变量被误删、重名冲突的问题:
% 绑定回调前初始化存储区 fig = gcf; setappdata(fig, 'clicked_indices', []); set(H, 'ButtonDownFcn', {@LineSelected, H, fig}) function LineSelected(ObjectH, ~, H, fig) set(ObjectH, 'LineWidth', 4); set(H(H ~= ObjectH), 'LineWidth', 2); % 按需选择存储内容,二选一即可 stored_val = find(H == ObjectH); % stored_val = ObjectH.XData(1); % 读写Figure内置存储区 click_hist = getappdata(fig, 'clicked_indices'); click_hist(end+1) = stored_val; setappdata(fig, 'clicked_indices', click_hist); % 可选:同步到工作区 assignin('base', 'IndInWorkSpace', click_hist); end
如需清空历史记录,执行setappdata(gcf, 'clicked_indices', [])即可。
内容的提问来源于stack exchange,提问作者user3406207
相关产品推荐
相关产品推荐

