magicdraw 开发

基于MagicDraw 19.0版本,如何通过调用提供的api接口,加载指定的项目,并控制状态机的运行、停止、事件触发等操作。

在MagicDraw 19.0版本中,你可以使用提供的API接口来加载指定的项目,并控制状态机的运行、停止和事件触发等操作。以下是一个简单的示例代码,演示了如何使用MagicDraw的API来实现这些功能:

import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.openapi.uml.SessionManager;
import com.nomagic.magicdraw.sysml.util.SysMLUtil;
import com.nomagic.magicdraw.teamwork2.locks.ILockProjectListener;
import com.nomagic.magicdraw.uml.Finder;
import com.nomagic.magicdraw.uml.symbols.DiagramPresentationElement;
import com.nomagic.magicdraw.uml.symbols.PresentationElement;
import com.nomagic.uml2.ext.jmi.helpers.ModelHelper;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.*;
import com.nomagic.uml2.impl.ElementsFactory;

public class MagicDrawStateMachineControl {
    public static void main(String[] args) {
        // 加载项目
        Application application = Application.getInstance();
        Project project = application.getProject();
        
        // 获取状态机
        ElementsFactory factory = application.getProjectsManager().getActiveProject().getElementsFactory();
        Model root = project.getModel();
        Package package = SysMLUtil.getPackageByName(root, "Your Package Name");  // 替换为你的包名
        StateMachine stateMachine = (StateMachine) Finder.byTypeRecursively().findElementByName(package, "Your State Machine Name");  // 替换为你的状态机名
        
        // 运行状态机
        runStateMachine(stateMachine);
        
        // 停止状态机
        stopStateMachine(stateMachine);
        
        // 触发事件
        triggerEvent(stateMachine, "Your Event Name");  // 替换为你的事件名
    }
    
    // 运行状态机
    private static void runStateMachine(StateMachine stateMachine) {
        SessionManager.getInstance().createSession("Run State Machine");
        try {
            stateMachine.startBehavior(null);
            SessionManager.getInstance().closeSession();
        } catch (Exception e) {
            e.printStackTrace();
            SessionManager.getInstance().cancelSession();
        }
    }
    
    // 停止状态机
    private static void stopStateMachine(StateMachine stateMachine) {
        SessionManager.getInstance().createSession("Stop State Machine");
        try {
            stateMachine.stop();
            SessionManager.getInstance().closeSession();
        } catch (Exception e) {
            e.printStackTrace();
            SessionManager.getInstance().cancelSession();
        }
    }
    
    // 触发事件
    private static void triggerEvent(StateMachine stateMachine, String eventName) {
        SessionManager.getInstance().createSession("Trigger Event");
        try {
            CallEvent event = ModelHelper.findElementByName(stateMachine.getOwnedMember(), eventName, CallEvent.class);
            stateMachine.send(event);
            SessionManager.getInstance().closeSession();
        } catch (Exception e) {
            e.printStackTrace();
            SessionManager.getInstance().cancelSession();
        }
    }
}


以上代码只是一个简单示例,并且可能需要根据你的实际情况进行调整。你需要替换示例中的包名、状态机名和事件名为你实际使用的值。

此外,你需要确保在运行代码前已经正确加载了MagicDraw的相关库文件,并将其添加到项目的构建路径中。

建议查阅MagicDraw的官方文档和API参考,以获取更详细的信息