Eclipse Graphiti,如何创建“CustomFeature的创建和获取所有元素”?

时间:2013-05-02 11:34:03

标签: eclipse editor graphiti

我有2个问题,也许有人可以告诉我如何做到这一点

我创建了从AbstractCustomFeature扩展的新“testFeature”,可以在我的Diagram中调用它。如何获得包含图中所有元素的List?(我想在开始和之后更新它们的名称和颜色)

我的第二个问题是: 我正在尝试将一些元素添加到图表中而不拖放它们从调色板中删除。

例如我在图中保存了一些元素,而我的“模型说我想念图中的3个元素”。我想编写一个自定义功能,只需一次/两次点击就可以在Graphiti图中绘制/放置缺少的元素,也许我需要在这部分使用Zest?但是在开始时我只想放几个元素而不从调色板中删除它们,我该怎么做?

也许有人可以指点我?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

  

如何获得包含图中所有元素的List?

DiagramContainerShape,您可以致电getChildren()来检索所有形状

  

向图中添加一些元素而不拖放它们从调色板中删除。

对象是否已在EMF模型中创建,并且您只希望它将图形对应物添加到图表中?如果是这样,您需要自己实例化并执行相应的XXXAddFeature类。

在其他地方(更可能的情况是,如果你想模仿调色板中的一些拖放),你必须调用正确的XXXCreateFeature,这将添加(“创建”,在Graphiti说法中)元素模型(通常,创建主体将在末尾调用addGraphicalRepresentation(),它还将通过在内部调用适当的XXXAddFeature)将相应的图形元素添加到图表中。

答案 1 :(得分:0)

OK!这是我的解决方案:

class testFeature extends AbstractCustomFeature {
    //...
      public void execute(ICustomContext context) {
          Diagram diagram = getDiagram();                     //get Diagram
          EList<Shape> diagramChildren= diagram.getChildren();//get List with all Children's
          Iterator<Shape> it = diagramChildren.iterator();    //Build iterator for this List


          //go through all objects which are in the Diagram
          while (it.hasNext()) {
              Shape testObjekt = it.next();                                                 
              PictogramElement pe =  testObjekt.getGraphicsAlgorithm().getPictogramElement(); 
              Object bo = getBusinessObjectForPictogramElement(pe);
              //BUILD YOUR EMF & GRAPHITI projects together!!!!
              //otherwise you get always false after editor restart
              if (bo instanceof graphicElement) {
                  graphicElement sElement = (graphicElement)bo;
                  if(pe instanceof ContainerShape){
                      RoundedRectangle testR= (RoundedRectangle) pe.getGraphicsAlgorithm();
                      //testR is my RoundedRectangle like in help tutorial

                      //changes are possible here:
                      //...

                      ContainerShape cs = (ContainerShape) pe;
                      for (Shape shape : cs.getChildren()) {
                        //set Name
                          if (shape.getGraphicsAlgorithm() instanceof Text) {
                              Text text = (Text) shape.getGraphicsAlgorithm();
                                text.setValue("new name!");
                          }
                          //set Line color
                          if (shape.getGraphicsAlgorithm() instanceof Polyline) {
                              Polyline polyline = (Polyline)shape.getGraphicsAlgorithm();
                              polyline.setForeground(manageColor(myColorGreen));
                              polyline.setLineWidth(3);
                          }
                      }
                  }
              }
          }