Creating Inner Swimlanes Programatically

MagicDraw OpenAPI, scripting related questions and discussions

Moderator: Moderators

Creating Inner Swimlanes Programatically

Postby magicdrawUser102983 » Sat Feb 06, 2021 7:52 pm

I am trying to programmatically create a swimlane with inner swimlanes. I can get the ActivityPartition objects correctly in the Containment tree, but I cannot create the corresponding SwimlaneView object. This is the code I have so far

Code: Select all
         smObj = SessionManager.getInstance();
         smObj.createSession(project, "Object Creator " + UUID.randomUUID().toString());

         DiagramPresentationElement diagram = project.getActiveDiagram();
         PresentationElementsManager presentationElementsManager = PresentationElementsManager.getInstance();

         ActivityPartition activityPartition = project.getElementsFactory().createActivityPartitionInstance();
         activityPartition.setName("Parent");
         activityPartition.setOwner(diagram.getDiagram().getOwner());

         ActivityPartition child1 = project.getElementsFactory().createActivityPartitionInstance();
         child1.setName("Child 1");
         child1.setOwner(activityPartition);

         ActivityPartition child2 = project.getElementsFactory().createActivityPartitionInstance();
         child2.setName("Child 2");
         child2.setOwner(activityPartition);

         SwimlaneView parentLanes = presentationElementsManager.createSwimlane(Arrays.asList(activityPartition),
               Collections.emptyList(), diagram);

         SwimlaneView childLanes = presentationElementsManager.createSwimlane(Arrays.asList(child1, child2),
               Collections.emptyList(), diagram);

         for (SwimlaneCellView cell : parentLanes.getAllCells()) {
            childLanes.setParent(cell);
         }

         presentationElementsManager.movePresentationElement(parentLanes, new Point(50, 50));

         smObj.closeSession(project);
         smObj = null;


I get a result which I attached, but it is not valid.

Any guidance on how to create inner swimlanes programmatically would be greatly appreciated.
You do not have the required permissions to view the files attached to this post.
magicdrawUser102983
Forum Newbie
Forum Newbie
 
Posts: 4
Posts Rating:1
Joined: Mon Jan 06, 2020 9:42 am

Re: Creating Inner Swimlanes Programatically

Postby magicdrawUser102983 » Wed Feb 10, 2021 8:01 am

So I got the answer from the great MagicDraw customer support, I am posting it here in case anyone else needs a solution to a similar issue.

Code: Select all
      //Collect required general variables: project, diagram etc.
      DiagramPresentationElement diagram = project.getActiveDiagram();

      //Create command. This is same as SessionManager.createSession(), but we will need MacroCommand for further code.
      CommandHistory history = project.getCommandHistory();
      MacroCommand command = history.startCommand("CREATE SWIMLANE");

      //This code creates partitions, just as you provided. Parent, child1, child2.
      ActivityPartition activityPartition = project.getElementsFactory().createActivityPartitionInstance();
      activityPartition.setName("Parent");
      activityPartition.setOwner(diagram.getDiagram().getOwner());

      ActivityPartition child1 = project.getElementsFactory().createActivityPartitionInstance();
      child1.setName("Child 1");
      child1.setOwner(activityPartition);

      ActivityPartition child2 = project.getElementsFactory().createActivityPartitionInstance();
      child2.setName("Child 2");
      child2.setOwner(activityPartition);

      //Initialize initial swimlane and create it via SymbolCreator. Can be done via PresentationElementsManager too.
      SwimlaneView swimlaneView = new SwimlaneView(diagram);
      final SymbolCreator symbolCreator = new SymbolCreator(diagram);
      symbolCreator.setSelectCreatedSymbol(false);
      swimlaneView = (SwimlaneView) symbolCreator.addSymbol(command, swimlaneView);
      swimlaneView.setLocation(200, 100);

      //Initialize swimlanesBuilder. It will construct swimlaneHeaderView. False flags indicate isVertical. False => horizontal.
      SwimlaneBuilder builder = new SwimlaneBuilder(swimlaneView);
      SwimlaneHeaderView swimlaneHeaderView = builder.addSwimlane(activityPartition, swimlaneView.getSwimlanes(false), swimlaneView, false);

      //Create SwimlanesStructure.
      List<MultiSwimlaneStructure> multiStructures = new ArrayList<>();
      multiStructures.add(new MultiSwimlaneStructure(null, child1));
      multiStructures.add(new MultiSwimlaneStructure(null, child2));

      //Create swimlane and execute its creation command.
      MacroCommand cmd = new AddSwimlane(swimlaneView, false, swimlaneHeaderView, false, true, multiStructures);
      cmd.execute();
      history.complete();
magicdrawUser102983
Forum Newbie
Forum Newbie
 
Posts: 4
Posts Rating:1
Joined: Mon Jan 06, 2020 9:42 am

Re: Creating Inner Swimlanes Programatically

Postby dl007 » Tue Jan 17, 2023 4:07 pm

Where is the documentaion SwimlaneBuilder? I tried searching it but no results
dl007
Forum Newbie
Forum Newbie
 
Posts: 4
Posts Rating:0
Joined: Wed Jan 11, 2023 12:18 pm


Return to Programmatic Extendibility

Who is online

Users browsing this forum: No registered users and 0 guests