Cameo 2021x插件开发:通过OpenAPI设置依赖矩阵行/列范围
解决Cameo Systems Modeler 2021x Refresh2依赖矩阵行/列范围设置问题
1. 标准稳定的OpenAPI实现方式
在CSM 2021x Refresh2中,官方公开API推荐通过DependencyMatrixDiagram类结合范围相关API设置行/列范围,避免依赖FilterSettings这类未公开内部类。若该API受限,也可通过操作矩阵图的构造型标记值实现,这是兼容性更强的 fallback 方案。
2. 实现方案选择
- 优先使用
DependencyMatrixDiagram公开API,这是官方推荐的稳定方式; - 若API无法访问,可通过
StereotypesHelper手动设置构造型标记值,该方式不依赖内部类,适配性更好。
代码片段1:使用公开API设置范围
import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.core.Project; import com.nomagic.magicdraw.dependencymatrix.DependencyMatrixDiagram; import com.nomagic.magicdraw.dependencymatrix.scope.Scope; import com.nomagic.magicdraw.dependencymatrix.scope.ScopeFactory; import com.nomagic.magicdraw.diagrams.DiagramPresentationElement; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package; public class DependencyMatrixScopeSetter { public static void setMatrixScope(DiagramPresentationElement matrixDiagram, Package rowScopePackage, Package columnScopePackage) { Project project = Application.getInstance().getProject(); if (!(matrixDiagram instanceof DependencyMatrixDiagram)) { throw new IllegalArgumentException("传入的图不是依赖矩阵图"); } DependencyMatrixDiagram dmDiagram = (DependencyMatrixDiagram) matrixDiagram; // 创建行范围:指定目标Package作为范围根元素 Scope rowScope = ScopeFactory.createScope(project, rowScopePackage); // 创建列范围:指定目标Package作为范围根元素 Scope columnScope = ScopeFactory.createScope(project, columnScopePackage); // 为矩阵设置行/列范围 dmDiagram.setRowScope(rowScope); dmDiagram.setColumnScope(columnScope); // 触发矩阵刷新计算 dmDiagram.update(); } }
代码片段2:手动设置构造型标记值(兼容方案)
如果DependencyMatrixDiagram相关API无法访问,可直接操作依赖矩阵图的构造型属性:
import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.core.Project; import com.nomagic.magicdraw.diagrams.DiagramPresentationElement; import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package; import com.nomagic.uml2.ext.magicdraw.mdprofiles.Stereotype; import java.util.Collections; public class DMMarkedValueScopeSetter { public static void setMatrixScopeViaMarkedValue(DiagramPresentationElement matrixDiagram, Package rowScopePackage, Package columnScopePackage) { Project project = Application.getInstance().getProject(); // 获取Cameo内置的DependencyMatrix构造型 Stereotype dmStereotype = StereotypesHelper.getStereotype(project, "DependencyMatrix", "DependencyMatrixProfile"); if (dmStereotype == null) { throw new IllegalStateException("无法找到DependencyMatrix构造型"); } // 设置行范围:传入目标元素列表 StereotypesHelper.setStereotypePropertyValue(matrixDiagram, dmStereotype, "rowScope", Collections.singletonList(rowScopePackage)); // 设置列范围:传入目标元素列表 StereotypesHelper.setStereotypePropertyValue(matrixDiagram, dmStereotype, "columnScope", Collections.singletonList(columnScopePackage)); // 刷新矩阵图 matrixDiagram.getDiagram().refresh(); } }
注意事项
- 插件需在
plugin.xml中声明依赖com.nomagic.magicdraw.dependencymatrix模块; - 标记值方案中,
DependencyMatrixProfile是Cameo内置配置文件,构造型及属性名称在2021x版本中保持稳定; - 设置范围后必须调用
update()或refresh()触发矩阵重新计算。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

