2011-10-26 12 views
3

matlab関数getline(画像処理ツールボックス)は、ポリラインの位置を(以前はカーソルで定義されていた)リターンキーまたはスペースバーを押しながらまたはをクリックします。MATLAB:getline()を修正して 'ダブルクリックで終了入力'機能を削除する

私のバターフィンガーと誤ってダブルクリックするので、ダブルクリックで終了する機能を削除したいと思います。

私は何を変更する必要がありますか、どのような機能を探しているべきですか、私はダブルクリックがmatlabでどのように定義されているかを知ることができません。

乾杯!

答えて

2

MATLABは、マウスをクリックしたときの処理を定義するグラフィックスオブジェクトと "コールバック"関数を関連付けます。getline()では、参照する部分はNextButtonDown()サブ関数です。これは、最初のマウスを押して行を開始した後の後続のマウスの押下に関連するコールバックです。キーはSelectionType Figureプロパティをチェックします。ダブルクリックの場合はopenになります。その場合、それは図を閉じます。したがって、その機能を無効にするには、余分なケースとチェックロジックを削除してください。ここに私のr2009bバージョンのdiffは次のとおりです。

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例をコメントアウトするために必要な'は' open 'ではなく' normal 'であり、すなわち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のは最初の2例を区別するためにflag変数のように使用、その後のクリックで呼び出されるNextButtonDownを設定最初のクリック、上FirstButtonDownを呼び出すため

これは、二回行わなければなりませんでした。

上記イベントリスナー関数のコード:

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

関連する問題