如何在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();
代码说明
- 共享选择模型:通过
ImageDisplayGetSelectionModel获取原始轮廓图的选择模型,再用ImageDisplaySetSelectionModel赋值给导数图,实现选择操作的双向自动同步。 - 复合文档布局:简化了布局逻辑,直接垂直堆叠两个图像显示,无需复杂的按钮切换逻辑。
- 交互体验:用户在任意一个图上拖动选择框,另一个图会实时同步显示相同的选择区域,完全符合需求。
内容的提问来源于stack exchange,提问作者Samuel Hao
相关产品推荐
相关产品推荐

