Events 数字显微照片脚本对象是否可能收到图像ROI变化的通知?

Events 数字显微照片脚本对象是否可能收到图像ROI变化的通知?,events,listeners,dm-script,Events,Listeners,Dm Script,DigitalMicrograph脚本文档暗指各种类型的侦听器对象,可用于向脚本对象通知各种类型的事件。特别是,ImageDisplay对象明确支持键侦听器,因此当击键事件针对特定的图像显示时,可以通知脚本对象。是否可以通过类似的机制接收图像上的ROI大小或位置已更改的通知?是的。事实上,就投资回报率而言,有两种可能性 第一种选择:倾听特定的投资回报率 数字显微照片中的任何ROI都有一个唯一的ID号。您可以使用下面的脚本将侦听器添加到特定的ROI-ID。请注意,相同的ROI可以同时放置在多个图

DigitalMicrograph脚本文档暗指各种类型的侦听器对象,可用于向脚本对象通知各种类型的事件。特别是,ImageDisplay对象明确支持键侦听器,因此当击键事件针对特定的图像显示时,可以通知脚本对象。是否可以通过类似的机制接收图像上的ROI大小或位置已更改的通知?

是的。事实上,就投资回报率而言,有两种可能性


第一种选择:倾听特定的投资回报率 数字显微照片中的任何ROI都有一个唯一的ID号。您可以使用下面的脚本将侦听器添加到特定的ROI-ID。请注意,相同的ROI可以同时放置在多个图像显示器上。(“链接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”作为消息,并且第三个参数字符串(ConnectionID)应该是唯一的,以便可以使用它删除此特定连接,如图所示。 这种方法的主要优点是简单


第二个选项:收听特定的图像显示 还有一些监听器可以连接到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 )
}
除非您必须在多个图像显示上监视特定的ROI,否则第二个选项是更通用的。您注册roi_changed事件的方法不仅为您提供了roi的句柄,还提供了它所在的显示器。数字变量包含事件标志,告诉您发生了什么变化

在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 )

例子 您可以在上找到listerner类型脚本示例,即: