2014-04-08 87 views
3

我正在尋找與Enterprise Architect中的「在所有圖中查找」功能(Strg + U)對應的API函數。在Enterprise Architect中「在所有圖中查找」的等效函數

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

回答

2

您可能需要使用查詢,

試試這個

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

+0

THX!這幫助我開發了這個方法。 – user2722077

0

如果你會喜歡留在這裏API,您必須遞歸地遍歷模型樹中的包,將圖添加到集合中(ok,VBScript中的Dictionary對象)。 然後您可以從圖表中找到所有的圖表對象。然後DiagramObjects與元素相關(請記住,元素可能用更多的圖表表示)。

另一種方法可能是使用Repository.SQLQuery方法,它應該返回XML格式的結果集(我還沒有測試過)。但是你需要在機器上存在MSXML來解析它(並跟上版本)。

通常,如果你想掃描整個模型,並且你不需要父子關係,SQL應該更適合。反之亦然。

0

我有我的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; 
} 

功能getDiagramsByQueryModel類看起來像這樣

//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; 
} 
相關問題