Эквивалентная функция, которую можно найти на всех диаграммах в Enterprise Architect

Я ищу функцию API, соответствующую функции «найти на всех диаграммах» (Strg + U) в Enterprise Architect.

Класс элемент предоставляет диаграммы атрибутов, которые должны возвращать набор диаграмм, но в моем случае он всегда возвращает пустой список. Это неправильный путь?

РЕДАКТИРОВАТЬ: я был бы рад функции, которая возвращает набор диаграмм, включающих элемент.

РЕШЕНИЕ:

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;
}

С уважением МК


person user2722077    schedule 08.04.2014    source источник


Ответы (3)


Возможно, вам придется использовать запрос,

Попробуй это

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

person Nizam Mohamed    schedule 08.04.2014
comment
Спасибо! Это помогло мне разработать метод. - person user2722077; 09.04.2014

Если вы хотите остаться с API, вам нужно рекурсивно пройтись по пакетам в дереве модели, добавив диаграммы в коллекцию (хорошо, объект Dictionary в VBScript). Затем вы найдете все объекты Diagram из Diagrams. Затем объекты DiagramObject относятся к элементам (помните, что элемент может быть представлен в нескольких диаграммах).

Другой подход может заключаться в использовании метода Repository.SQLQuery, который должен возвращать набор результатов в формате XML (я еще не проверял это). Но вам понадобится MSXML, присутствующий на машине, чтобы анализировать его (и не отставать от версий).

Как правило, если вы хотите сканировать всю модель и вам не нужны отношения родитель-потомок, лучше подойдет SQL. Наоборот.

person murphy    schedule 24.06.2016

У меня есть такая же функция в моей 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;
}

Функция getDiagramsByQuery в модели < /a> класс выглядит так

//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;
}
person Geert Bellekens    schedule 25.06.2016