是的,有。事实上,就投资回报率而言,有两种可能性。
第一个选项:听取特定的投资回报率
DigitalMicrograph 中的任何 ROI 都有一个唯一的 ID 号。您可以使用下面的脚本向该特定 ROI-ID 添加侦听器。请注意,完全相同的ROI 可以同时放置在多个 ImageDisplay 上。 (“链接的投资回报率”)。只要 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" )
}
此方法仅接受“已更改”作为消息,并且第三个参数字符串(ConnectionID)应该是唯一的,以便可以使用它来删除此特定连接,如图所示。
这种方法的主要优点是它的简单性。
第二个选项:收听特定的图像显示
还有一些侦听器可以连接到 imageDisplay 对象。这允许捕获来自此 imageDisplay 上“任何”ROI 的消息,但您可以再次使用 unique-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 )
Examples
您可以在以下位置找到侦听器打字稿示例FELIM 脚本数据库, i.e.: