You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用预定义函数捕获ROI变更事件?现有代码无响应求助

问题排查与修复

你的代码存在两个关键问题,导致roi_changed事件无触发反馈:

1. 事件监听器注册参数错误

ImageDisplayAddEventListener仅接受单个消息映射字符串作为第三个参数,你拆分两个字符串分别传入,导致roi_changed的映射未被正确注册。需将多个事件映射用分号;合并为一个字符串。

2. ROI变更事件的回调函数签名不匹配

roi_changed事件的回调函数参数数量、顺序不符合DM的定义,正确参数列表应为:
void 回调函数名( object self, number flags, ImageDisplay disp, number roi_flags, ROI theRoi )
你的代码多了disp_flags参数且顺序错误,导致事件触发时无法正确调用回调。


修正后的完整代码

class CListen
{              
    CListen( object self ) { Result( "\n CListen object " + self.ScriptObjectGetId() + " created in memory."); } 
    ~CListen( object self ) { Result( "\n CListen object " + self.ScriptObjectGetId() + " removed from memory."); } 

    // 修正参数匹配roi_changed事件定义
    void OnROI_c( object self, Number flags, ImageDisplay disp, Number roi_flags, ROI theRoi ) 
    {
        string nam = "[" + disp.ImageDisplayGetImage().GetLabel() + "]" 
        result( "\n ROI changed in " + nam + ", flags: " + roi_flags )
    } 

    void OnClick( object self, number flags, imageDisplay disp, number mx, number my ) 
    { 
        string name = "[" + disp.ImageDisplayGetImage().GetLabel() + "]" 
        result( "\n Mouse-click in " + name + " at " + mx + " / " + my ) 
    } 
} 

{  
    image img := RealImage( "Test", 4, 100, 100 ) 
    img.ShowImage() 
    imageDisplay disp = img.ImageGetImageDisplay( 0 ) 
    ROI theRoi = NewROI()
    theRoi.ROISetRectangle( 10, 10, 40, 40 )
    disp.ImageDisplayAddROI( theRoi )
 
    object listener = Alloc( CListen ) 
    // 合并事件映射为单个字符串
    string messagemap = "unassociated_click:OnClick;roi_changed:OnROI_c"
    number listenID = ImageDisplayAddEventListener( disp, listener, messagemap ) 
}             

验证说明

运行修正后的代码:

  • 点击图像空白区域,会触发OnClick输出点击坐标
  • 拖动或修改ROI时,会触发OnROI_c输出ROI变更标识信息

内容的提问来源于stack exchange,提问作者E Voelkl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:05:03