You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何基于所有者自动为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

火山引擎 最新活动