如何基于所有者自动为Cameo System Modeler图表应用构造型?
实现Cameo图表创建时自动应用构造型的插件
核心思路
通过注册模型元素变更监听器,捕获图表(Diagram)的创建事件,检查其所有者名称,匹配后自动应用目标构造型。
代码实现步骤
1. 插件入口类
创建插件初始化类,继承MagicDraw/Cameo的Plugin,在启动时注册监听器:
import com.nomagic.magicdraw.core.Application; import com.nomagic.magicdraw.plugins.Plugin; import com.nomagic.magicdraw.openapi.uml.ModelElementsManager; import com.nomagic.magicdraw.openapi.uml.ModelElementsManagerListener; public class AutoApplyStereotypePlugin extends Plugin { private ModelElementsManagerListener diagramCreationListener; @Override public void init() { ModelElementsManager manager = Application.getInstance().getProject().getModelElementsManager(); diagramCreationListener = new DiagramStereotypeApplierListener(); manager.addModelElementsManagerListener(diagramCreationListener); } @Override public void dispose() { if (diagramCreationListener != null) { Application.getInstance().getProject().getModelElementsManager().removeModelElementsManagerListener(diagramCreationListener); } } @Override public boolean close() { return true; } }
2. 模型元素监听器实现
编写监听器类,处理元素创建事件,判断目标图表并应用构造型:
import com.nomagic.magicdraw.openapi.uml.ModelElementsManagerListener; import com.nomagic.magicdraw.openapi.uml.SessionManager; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Diagram; import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element; import com.nomagic.uml2.ext.magicdraw.mdprofiles.Stereotype; import com.nomagic.uml2.impl.ElementsFactory; public class DiagramStereotypeApplierListener implements ModelElementsManagerListener { private static final String TARGET_OWNER_NAME = "Test"; private static final String TARGET_STEREOTYPE_NAME = "TestStereotype"; @Override public void elementAdded(Element element) { if (element instanceof Diagram) { Diagram diagram = (Diagram) element; Element owner = diagram.getOwner(); if (owner != null && TARGET_OWNER_NAME.equals(owner.getName())) { SessionManager.getInstance().createSession("Apply TestStereotype to Diagram"); try { Stereotype testStereotype = findStereotypeInProject(diagram, TARGET_STEREOTYPE_NAME); if (testStereotype != null) { diagram.addStereotype(testStereotype); } } finally { SessionManager.getInstance().closeSession(); } } } } private Stereotype findStereotypeInProject(Element contextElement, String stereotypeName) { ElementsFactory factory = contextElement.getElementFactory(); // 若构造型属于特定Profile,可改为factory.getStereotype(stereotypeName, "目标Profile名称") return factory.getStereotype(stereotypeName); } // 以下为未用到的监听器方法,空实现即可 @Override public void elementRemoved(Element element) {} @Override public void elementModified(Element element) {} @Override public void elementMoved(Element element, Element oldOwner) {} }
关键注意事项
- 构造型预先定义:确保
TestStereotype已在当前Cameo项目的Profile中创建,否则查找方法会返回null。 - 会话强制要求:所有模型修改操作必须在
SessionManager的会话中执行,否则会触发API异常。 - 所有者类型限制:如果需要限定所有者类型(比如仅Class或Package),可将
owner != null的判断改为owner instanceof Class && ...这类更具体的条件。 - 插件打包规范:按照Cameo/MagicDraw插件标准打包,确保编译后的class文件路径与
plugin.xml配置一致,正确依赖MagicDraw API包。
内容的提问来源于stack exchange,提问作者Leo




