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

如何在DM中同步原始轮廓与导数曲线的选择区域?

优化DM脚本中原始轮廓与导数曲线的选择区域同步方法

我用DM脚本处理原始轮廓时,先计算一阶导数检测边缘,然后让用户在导数图中选择边缘间的区域,希望选择框同步显示在原始轮廓图里。目前用复合函数垂直堆叠两个图实现,但交互同步繁琐不够优雅,有没有更优的方法?


最优实现思路:共享选择模型或监听选择事件

DM脚本提供了两种更高效的同步方式,无需手动维护复合文档布局的同步逻辑:

方法1:共享选择模型(推荐,最简洁)

让原始轮廓图和导数图的ImageDisplay直接共享同一个选择模型(Selection Model),这样任何一个图上的选择操作都会自动同步到另一个图,完全无需额外事件处理。

方法2:监听选择变化事件(适合自定义同步逻辑)

如果需要对选择区域做额外处理(比如坐标转换、过滤),可以给其中一个ImageDisplay添加选择变化监听器,实时更新另一个图的选择区域。


代码示例(共享选择模型实现)

以下是简化后的完整代码,实现原始轮廓与导数曲线的选择框自动同步:

// 计算一阶导数(绝对值)
Image absolute_first_derivative(Image in)  
{  
    Number size_x, size_y, origin, scale  
    String units  
    Image out  

    in.ImageGetDimensionCalibration(0, origin, scale, units, 0)  
    in.GetSize(size_x, size_y)  
    if (size_y != 1) Result("仅支持1D图像")  

    out := RealImage("一阶导数(绝对值)", 4, size_x, size_y)  
    out = abs(in[icol + 1, irow] - in[icol, irow])  
    out.ImageSetDimensionCalibration(0, origin, scale, units, 0)  
    return out  
}

// 同步选择区域的核心实现
void SyncContourAndDerivativeSelection()
{
    // 创建测试轮廓图
    Image raw_contour := RealImage("原始轮廓", 4, 200);
    raw_contour = 100;
    raw_contour[0,0,1,50] = 50;
    raw_contour[0,150,1,200] = 50;

    // 计算导数图
    Image derivative := absolute_first_derivative(raw_contour);

    // 创建两个图像显示窗口
    ImageDisplay disp_raw = raw_contour.ImageCreateImageDisplay(-2);
    ImageDisplay disp_deriv = derivative.ImageCreateImageDisplay(-2);

    // 关键:让两个显示共享同一个选择模型
    TagGroup selection_model = disp_raw.ImageDisplayGetSelectionModel();
    disp_deriv.ImageDisplaySetSelectionModel(selection_model);

    // 用复合文档垂直堆叠显示两个图
    CompoundDocument doc = NewCompoundDocument("轮廓与导数同步选择");
    doc.ImageDocumentAddImageDisplay(disp_raw);
    doc.ImageDocumentAddImageDisplay(disp_deriv);

    // 设置垂直布局
    TagGroup layout = CreateCompoundDocumentLayoutTagGroup("同步选择视图");
    TagGroup row1 = layout.CompoundDocumentLayoutAddRow(300);
    row1.CompoundDocumentLayoutAddColumnAsImage(600, "原始轮廓", disp_raw.ComponentGetCompoundID());
    TagGroup row2 = layout.CompoundDocumentLayoutAddRow(300);
    row2.CompoundDocumentLayoutAddColumnAsImage(600, "一阶导数", disp_deriv.ComponentGetCompoundID());
    
    doc.CompoundDocumentShow(layout);
}

// 运行脚本
SyncContourAndDerivativeSelection();

代码说明

  1. 共享选择模型:通过ImageDisplayGetSelectionModel获取原始轮廓图的选择模型,再用ImageDisplaySetSelectionModel赋值给导数图,实现选择操作的双向自动同步。
  2. 复合文档布局:简化了布局逻辑,直接垂直堆叠两个图像显示,无需复杂的按钮切换逻辑。
  3. 交互体验:用户在任意一个图上拖动选择框,另一个图会实时同步显示相同的选择区域,完全符合需求。

内容的提问来源于stack exchange,提问作者Samuel Hao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:27:09