Возможно ли, чтобы объект сценария DigitalMicrograph уведомлялся об изменении ROI на изображении?

Документация по сценариям DigitalMicrograph ссылается на различные типы объектов Listener, которые можно использовать для уведомления объекта сценария о различных типах событий. В частности, объекты ImageDisplay имеют явную поддержку прослушивателей клавиш, поэтому объект сценария может быть уведомлен, когда событие нажатия клавиши нацелено на конкретное отображение изображения. Можно ли получать уведомления об изменении размера или положения области интереса на изображении с помощью аналогичного механизма?


person Mike Kundmann    schedule 25.11.2014    source источник


Ответы (1)


Да это так. На самом деле, что касается ROI, есть две возможности.


Первый вариант: прослушивание определенной области интереса

Любая область интереса в DigitalMicrograph имеет уникальный идентификационный номер. Вы можете добавить прослушиватель к этому конкретному ROI-ID, как в приведенном ниже сценарии. Обратите внимание, что идентичная область интереса может быть размещена более чем на одном 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" )
}

Этот метод принимает только «изменено» как сообщение, а третья строка параметра (ConnectionID) должна быть уникальной, чтобы ее можно было использовать для удаления этого конкретного соединения, как показано. Главным преимуществом этого метода является его простота.


Второй вариант: прослушивание определенного изображения.

Есть также прослушиватели, которые вы можете подключить к объекту 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_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 в базе данных сценариев FELIM. , то есть:

person BmyGuest    schedule 25.11.2014