2011-10-26 46 views
3

matlab函數getline(圖像處理工具箱)返回一個多段線(先前已用光標定義)的位置,點擊或按下返回鍵或空格鍵。MATLAB:修改getline()以刪除'雙擊'結束輸入'功能

由於我的黃油手指和意外雙擊我想刪除結束雙擊的能力。

我需要改變什麼部分,或者我需要尋找哪些函數,我無法找到雙擊在matlab中如何定義。

乾杯!

回答

2

MATLAB將「回調」功能與圖形對象相關聯,圖形對象定義了當單擊鼠標,按下按鍵等時要執行的操作。在getline()中,要查看的部分是NextButtonDown()子功能。這是在第一次鼠標按下以啓動線路後與後續鼠標按下相關聯的回調。關鍵是檢查SelectionType數字屬性,這將是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 
+0

您好,感謝您的幫助,但是,我不得不這樣做略有不同(我認爲),我需要註釋掉情況下,「selectionType '是'正常'而不是'開放',即325> 328和288> 290行。但是這現在可行,所以謝謝! – Tom

1

@JohnColby提供的答案通過編輯GETLINE.m功能文件解決您的問題。基本上你會註釋掉每一行,檢查是否執行雙擊。該信息通過查詢'SelectionType' figure屬性獲得。另外,如果你像我一樣,你討厭修改內置函數,那麼考慮下面的解決方案,不涉及改變任何現有的功能。下面是我們如何使用它的一個例子:

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

plot(x,y, 'Color','r') 

的想法是創建一個被觸發的'WindowButtonDownFcn'人物屬性更改時事件偵聽器。我們使用它來插入一個函數,該函數在之前設置的回調函數之前被調用(實際上,我們用自己的函數替換回調函數,在最後調用舊回調函數)。

這允許我們插入一個部分來檢查通話是否由雙擊觸發,並簡單地跳過這樣的事件。

這必須做兩次,因爲GETLINE第一次點擊時首先調用FirstButtonDown,這會在隨後的點擊中設置NextButtonDown來調用,因此使用flag變量來區分這兩種情況。

針對上述事件監聽器函數的代碼:

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 
+0

爲此歡呼,我需要在第一時間迅速和骯髒地完成它,但我會稍後嘗試實現它,因爲它似乎是更好的方法。 – Tom