【问题标题】:Equivalent function to "find in all diagrams" in Enterprise ArchitectEnterprise Architect 中“在所有图表中查找”的等效功能
【发布时间】:2014-05-21 05:57:04
【问题描述】:

我正在寻找与 Enterprise Architect 中的“在所有图表中查找”功能 (Strg + U) 对应的 API 函数。

element 类提供了应该返回图表集合的属性图,但在我的情况下它总是返回一个空列表。是不是走错路了?

编辑: 我会很高兴有一个函数返回包含该元素的图表集合。

解决方案:

public List<EA.Diagram> getAllDiagramsOfElement(EA.Element element){
        String xmlQueryResult = repository.SQLQuery(
                            "select dobj1.Diagram_ID " + 
                            "from t_diagramobjects dobj1 " +
                            "where dobj1.Object_ID = " + element.ElementID+";");
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(xmlQueryResult);
        XmlNodeList xnList = xml.SelectNodes("/EADATA/Dataset_0/Data/Row");
        List<EA.Diagram> result = new List<EA.Diagram>();

        foreach (XmlNode xn in xnList){
            result.Add(repository.GetDiagramByID(Convert.ToInt32(xn["Diagram_ID"].InnerText)));
        }
        return result;
}

致以诚挚的问候 MK

【问题讨论】:

    标签: enterprise-architect


    【解决方案1】:

    您可能必须使用查询,

    试试这个

    select * from t_diagramobjects dobj1, t_diagramobjects dobj2 where dobj1.object_id=dobj2.object_id and dobj1.diagram_id!=dobj2.diagram_id;

    【讨论】:

    • 谢谢!这帮助我开发了这种方法。
    【解决方案2】:

    如果您想继续使用 API,您必须递归地遍历模型树中的包,将图表添加到集合中(好的,VBScript 中的 Dictionary 对象)。 然后你从图表中找到所有图表对象。然后,DiagramObjects 与 Elements 相关(请记住,Element 可以在更多的 Diagrams 中表示)。

    另一种方法是使用 Repository.SQLQuery 方法,它应该返回 XML 格式的结果集(我还没有测试过)。但是你需要机器上存在 MSXML 来解析它(并跟上版本)。

    一般来说,如果要扫描整个模型并且不需要父子关系,SQL 应该更适合。反之亦然。

    【讨论】:

      【解决方案3】:

      我的Enterprise Architect Add-in Framework 中也有同样的功能,在ElementWrapper 类中实现:

      //returns a list of diagrams that somehow use this element.
      public override HashSet<T> getUsingDiagrams<T>() 
      {
          string sqlGetDiagrams = @"select distinct d.Diagram_ID from t_DiagramObjects d
                                    where d.Object_ID = " + this.wrappedElement.ElementID;
          List<UML.Diagrams.Diagram> allDiagrams = this.model.getDiagramsByQuery(sqlGetDiagrams).Cast<UML.Diagrams.Diagram>().ToList(); ; ;
          HashSet<T> returnedDiagrams = new HashSet<T>();
          foreach (UML.Diagrams.Diagram diagram in allDiagrams)
          {
              if (diagram is T)
              {
                  T typedDiagram = (T)diagram;
                  if (!returnedDiagrams.Contains(typedDiagram))
                  {
                      returnedDiagrams.Add(typedDiagram);
                  }
              }
          }
          return returnedDiagrams;
      }
      

      Model 类中的函数getDiagramsByQuery 如下所示

      //returns a list of diagrams according to the given query.
      //the given query should return a list of diagram id's
      public List<Diagram> getDiagramsByQuery(string sqlGetDiagrams)
      {
          // get the nodes with the name "Diagram_ID"
          XmlDocument xmlDiagramIDs = this.SQLQuery(sqlGetDiagrams);
          XmlNodeList diagramIDNodes =
              xmlDiagramIDs.SelectNodes(formatXPath("//Diagram_ID"));
          List<Diagram> diagrams = new List<Diagram>();
          foreach (XmlNode diagramIDNode in diagramIDNodes)
          {
              int diagramID;
              if (int.TryParse(diagramIDNode.InnerText, out diagramID))
              {
                  Diagram diagram = this.getDiagramByID(diagramID);
                  diagrams.Add(diagram);
              }
          }
          return diagrams;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-01
        • 1970-01-01
        • 2012-12-23
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        相关资源
        最近更新 更多