DigitalMicrograph スクリプトのドキュメントでは、さまざまな種類のイベントをスクリプト オブジェクトに通知するために使用できる、さまざまな種類の Listener オブジェクトについて触れています。具体的には、ImageDisplay オブジェクトはキー リスナーを明示的にサポートしているため、キーストローク イベントが特定の画像表示を対象としているときにスクリプト オブジェクトに通知できます。同様の仕組みで、画像上の ROI のサイズや位置が変更されたという通知を受け取ることはできますか?
1 に答える
はい、あります。実際、ROI に関する限り、2 つの可能性があります。
最初のオプション: 特定の ROI を聞く
DigitalMicrograph の ROI には、一意の ID 番号があります。以下のスクリプトのように、その特定の ROI-ID にリスナーを追加できます。同一のROI を複数の ImageDisplay に同時に配置できることに注意してください。(「リンクされた ROI」)。ROI オブジェクトが解放されない限り、接続されたリスナー オブジェクトは解放されませんが、接続を明示的に削除することもできます。
Class myRListen : object
{
myRListen( object self ) { Result( "\n myRListen " + self.ScriptObjectGetID() + " created.\n" ); }
~myRListen( object self ) { Result( "\n myRListen " + self.ScriptObjectGetID() + " destroyed.\n" ); }
void DoStuff( object self, ROI thisROI ){ Result( "ROI ID:" + thisROI.ROIGetID() + " acted!\n" ); }
}
// Main
{
Image img1 := RealImage( "Test 1", 4, 256, 256 )
img1 = iradius
img1.ShowImage()
Image img2 := RealImage( "Test 2", 4, 256, 256 )
img2 = icol
img2.ShowImage()
ROI testROI = NewROI()
testROI.ROISetVolatile(0)
testROI.ROISetRectangle( 50, 50, 100, 100 )
img1.ImageGetImageDisplay(0).ImageDisplayAddROI(testROI)
img2.ImageGetImageDisplay(0).ImageDisplayAddROI(testROI)
// Connect the ROI of specific ID to the "DoStuff" method of listener on "changed" message.
// The signature of the "DoStuff" method has to be of form ( object self , ROI thisROI )
// The method returns a unique ID for this connection.
Number roiID = testROI.ROIGetID()
object listener = Alloc(myRListen)
ConnectObject( roiID, "changed", "ConnectionID", listener, "DoStuff" )
if ( TwoButtonDialog( "Immediately disconnect?", "Yes", "No" ) )
DisConnectObject( roiID, "changed", "ConnectionID" )
}
このメソッドは、メッセージとして「changed」のみを受け入れます。3 番目のパラメーター文字列 (ConnectionID) は、示されているように、この特定の接続を削除するために使用できるように一意である必要があります。この方法の主な利点は、その単純さです。
2 番目のオプション: 特定の imageDisplay を聞く
imageDisplay オブジェクトに接続できるリスナーもあります。これにより、この imageDisplay の「任意の」ROI からのメッセージをキャッチできますが、一意の ROI-ID を使用して関心のあるものを除外することもできます。imageDisplay が解放されない限り、リスナー オブジェクトは解放されませんが、ここでも、手動で登録解除できます。
Class myRListen : object
{
myRListen( object self ) { Result( "\n myRListen " + self.ScriptObjectGetID() + " created.\n" ); }
~myRListen( object self ) { Result( "\n myRListen " + self.ScriptObjectGetID() + " destroyed.\n" ); }
void DoROIStuff( object self, Number e_fl, ImageDisplay idisp, Number r_fl, Number r_fl2, ROI thisROI ){ Result( "ROI ID:" + thisROI.ROIGetID() + " acted!\n" ); }
}
// Main
{
Image img := RealImage( "Test", 4, 256, 256 )
img = iradius
img.ShowImage()
ROI testROI1 = NewROI()
testROI1.ROISetVolatile( 0 )
testROI1.ROISetRectangle( 50, 50, 100, 100 )
ROI testROI2 = NewROI()
testROI2.ROISetVolatile( 0 )
testROI2.ROISetRectangle( 150, 150, 200, 200 )
testROI2.ROISetColor( 0, 0, 1 )
ImageDisplay disp = img.ImageGetImageDisplay( 0 )
disp.ImageDisplayAddROI( testROI1 )
disp.ImageDisplayAddROI( testROI2 )
// Connect the ROI of specific ID to the "DoStuff" method of listener on "changed" message.
// The signature of the "DoStuff" method has to be of form ( object self , ROI thisROI )
// The method returns a unique ID for this connection.
object listener = Alloc(myRListen)
Number listenerID = ImageDisplayAddEventListener( disp, listener, "roi_changed:DoROIStuff" )
if ( TwoButtonDialog( "Immediately disconnect?", "Yes", "No" ) )
ImageDisplayRemoveEventListener( disp, listenerID )
}
複数の imageDisplay で特定の ROI を監視する必要がない限り、2 番目のオプションがより用途の広いオプションです。roi_changed イベントを登録する方法は、ROI のハンドルだけでなく、ROI が置かれているディスプレイのハンドルも提供します。number 変数には、何が変更されたかを示すイベントフラグが含まれています。
GMS 2.3.1 では、現在、次の ROI メッセージを利用できます。
roi_added,
roi_removed,
roi_begin_track,
roi_end_track,
roi_property_changed,
roi_display_changed,
roi_changed
そしてそれらは署名の方法に接続する必要があります
void RAction( object self, Number e_fl, ImageDisplay idisp, Number r_fl, Number r_fl2, ROI r )
例
FELIM スクリプト データベースでリスナータイプのスクリプトの例を見つけることができます。