Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface MATLAB:修改getline()以删除';双击'结束输入;功能_User Interface_Matlab_Image Processing_Input - Fatal编程技术网

User interface MATLAB:修改getline()以删除';双击'结束输入;功能

User interface MATLAB:修改getline()以删除';双击'结束输入;功能,user-interface,matlab,image-processing,input,User Interface,Matlab,Image Processing,Input,matlab函数getline(图像处理工具箱)通过双击或按return键或空格键返回多段线的位置(先前已使用光标定义) 由于我的黄油手指和不小心双击,我想取消双击结束的功能 我需要更改哪些部分,或者我应该注意哪些函数,我甚至无法找到双击是如何在matlab中定义的 干杯 MATLAB将“回调”函数与图形对象相关联,图形对象定义单击鼠标、按键等时的操作。。在getline()中,要查看的部分是NextButtonDown()子函数。这是在第一次按下鼠标以启动行之后,与后续鼠标按下关联的回调。关键

matlab函数getline(图像处理工具箱)通过双击或按return键或空格键返回多段线的位置(先前已使用光标定义)

由于我的黄油手指和不小心双击,我想取消双击结束的功能

我需要更改哪些部分,或者我应该注意哪些函数,我甚至无法找到双击是如何在matlab中定义的

干杯

MATLAB将“回调”函数与图形对象相关联,图形对象定义单击鼠标、按键等时的操作。。在
getline()
中,要查看的部分是
NextButtonDown()
子函数。这是在第一次按下鼠标以启动行之后,与后续鼠标按下关联的回调。关键是检查
SelectionType
figure属性,双击该属性将
open
。在这种情况下,它会关闭图形。因此,要禁用该功能,只需删除额外的大小写并检查逻辑即可。以下是我的r2009b版本的差异:

306,310d305
< selectionType = get(GETLINE_FIG, 'SelectionType');
< if (~strcmp(selectionType, 'open'))
<     % We don't want to add a point on the second click
<     % of a double-click
< 
322,328d316
<     
< end
< 
< if (~strcmp(get(GETLINE_FIG, 'SelectionType'), 'normal'))
<     % We're done!
<     set(GETLINE_H1, 'UserData', 'Completed');
< end
306310D305
提供的答案通过编辑函数文件来解决您的问题。基本上,您可以注释掉检查是否执行了双击的每一行。此信息通过查询地物属性获得


P>可选的,如果你像我一样讨厌修改内置函数,那么考虑下面的解决方案,它不涉及改变现有的函数。以下是我们如何使用它的示例:

h = addlistener(handle(gcf), 'WindowButtonDownFcn', 'PostSet', @changedWBDFcn);
[x,y] = getline();
delete(h)

plot(x,y, 'Color','r')
其思想是创建一个事件监听器,当figure属性更改时触发该监听器。我们使用它插入一个函数,该函数在前面设置的回调函数之前被调用(实际上,我们用自己的函数替换回调函数,该函数在最后调用旧函数)

这允许我们插入一个部分,检查调用是否由双击触发,并跳过此类事件

这必须做两次,因为GETLINE first在第一次单击时调用
FirstButtonDown
,这将设置
NextButtonDown
在后续单击时调用,因此使用
标志
变量来区分这两种情况

上述事件侦听器函数的代码:

function changedWBDFcn(src,ev,flag)
    hFig = ev.AffectedObject;            %# figure handle
    currFcn = ev.NewValue;               %# current callback function
    delete(src);                         %# delete event listener
    if nargin < 3, flag = false; end     %# determine flag

    %# hijack WindowButtonDownFcn function
    set(hFig, 'WindowButtonDownFcn',{@wbdFcn,currFcn,flag})


    %# callback function
    function wbdFcn(o,e,currFcn,flag)
        %# skip anything but single-clicks
        if ~strcmpi(get(hFig,'SelectionType'),'normal')
            return
        end

        %# evaluate previous callback function
        hgfeval(currFcn)  %# getline('FirstButtonDown'),getline('NextButtonDown')

        %# repeat process after first click
        if flag
            addlistener(handle(hFig), 'WindowButtonDownFcn', ...
                'PostSet', {@changedWBDFcn,true});
        end
    end
end
功能更改DWBDFCN(src、ev、标志)
hFig=ev.infectedObject;%#数字手柄
currFcn=ev.NewValue;%#当前回调函数
删除(src);%#删除事件侦听器
如果nargin<3,则flag=false;结束%#确定标志
%#劫持WindowButtonDownFcn函数
设置(hFig,'WindowButtonDownFcn',{@wbdFcn,currFcn,flag})
%#回调函数
功能wbdFcn(o、e、currFcn、标志)
%#跳过任何操作,只跳过单击
if~strcmpi(get(hFig,'SelectionType'),'normal')
返回
结束
%#计算上一个回调函数
hgfeval(currFcn)%#getline('FirstButtonDown')、getline('NextButtonDown'))
%#第一次单击后重复此过程
如果旗
addlistener(句柄(hFig),'WindowButtonDownFcn'。。。
'PostSet',{@changedWBDFcn,true});
结束
结束
结束

您好,谢谢您的帮助,但是,我不得不稍微改变一下(我想),我需要注释掉“selectionType”是“正常”而不是“开放”的情况,即第325行>328行和第288行>290行。但这现在起作用了,谢谢!为此干杯,我首先需要快速而肮脏地完成它,但我稍后会尝试实现它,因为它看起来确实是一种更好的方式。