проверка объекта во вложенной ссылке через dxl - PullRequest
0 голосов
/ 24 января 2019

У меня следующая ситуация.Я хочу подсчитать в модуле 1, сколько объектов имеют ссылки в ссылках из модуля 3.

пример:

Модуль 1 Obj1 <- Модуль 2 Obj1 <- Модуль 3.Obj1 </p>

Модуль 1 Obj2 <- Модуль 2 Obj1 <- Модуль 3.Obj1 </p>

Модуль 1 Obj3 <- Модуль 2 Obj1 <- Модуль 3.Obj1 </p>

Модуль 1 Obj4 <- Модуль2 Obj1 </p>

Модуль 1 Obj5 <- Модуль 2 Obj1 </p>

В приведенном выше случае счетчик должен возвращать 3.

Возможно ли через DXL перейти по ссылке, итогда перейдите по другой ссылке?(без использования атрибутов Wizard или DXL)

Самое важное для меня: знать, сделал ли это кто-то другой, и можно ли это сделать.

1 Ответ

0 голосов
/ 26 января 2019

Пожалуйста, попробуйте следующий DXL из модуля, который имеет входящие ссылки. Перед запуском кода:

  1. убедитесь, что вы открываете окно «Edit DXL» из соответствующего модуля
  2. установить строковые значения, назначенные глобальной константе STR_LINK_MOD_FULLNAME (строка 17), на полное имя пути модуля связи, чьи ссылки вас интересуют
  3. установите строковые значения, назначенные глобальной константе STR_SRC_MOD_FULLNAME (строка 18), на полный путь к исходному формальному модулю (модуль 3, в вашем примере), ссылки которого вас интересуют

Вам не нужно ничего менять, чтобы это работало.

N.B. Я не рассматривал последствия анализа ссылок во всех ссылочных модулях, используя строку «*» вместо определенного имени модуля связи в строке 17 (см. Пункт 2 выше).

Я также не пытался объяснить код, хотя я старался быть вежливым и аккуратным после того, как DOORS и DXL этого требуют. Пожалуйста, не стесняйтесь отвечать на любые вопросы о том, что я сделал.

С уважением,

Richard

//<CheckObjectInNestedLink.dxl>

/*
 */

///////////////
// Sanity check

if (null (current Module))
{
    print "ERROR: this script must be run from a Formal Module."
}

///////////////////
// Global Constants

const string STR_LINK_MOD_FULLNAME = "/New Family Car Project/Admin/Satisfies" // the fullName of a single link module - results of using "*" have not been considered/tested
const string STR_SRC_MOD_FULLNAME  = "/New Family Car Project/Architecture/Architectural Design" // The fullName of the desired source Formal Module


///////////////////
// Global Variables

Module modSource               = null
Object objTarget               = null
Object objSource               = null
Link   lkIn                    = null
Skip   skLinkedMods            = create()
Skip   skObjsWithDesiredSource = create()

int intNoOfLinked              = 0


//////////////////////
// Auxiliary Functions

void closeSourceMods ()
{
    Module srcMod

    for srcMod in skLinkedMods do
    {
        close(srcMod)
    }
}

void openSourceMods (Object objWithLinks)
{
    ModName_ srcModRef
    Module   srcMod

    for srcModRef in (objWithLinks <- STR_LINK_MOD_FULLNAME) do
    {
        srcMod = read(fullName(srcModRef), false)
        put(skLinkedMods, srcMod, srcMod)
    }
}

void recurseFollowInLinks (Object objWithLinks)
{
    openSourceMods(objWithLinks)

    for lkIn in objWithLinks <- STR_LINK_MOD_FULLNAME do
    {
            openSourceMods(objWithLinks)
            objSource = source(lkIn)

            string strSrcModName = fullName(module(objSource))

            if (strSrcModName == STR_SRC_MOD_FULLNAME)
            {
                bool blNewEntry = put(skObjsWithDesiredSource, objTarget, objTarget)

                if (blNewEntry)
                {
                    intNoOfLinked++
                }
                //print "put(skObjsWithDesiredSource, " identifier(objTarget) ", " identifier(objTarget) ")\n"
            }

            recurseFollowInLinks(objSource)
    }
}

void checkObjectInNestedLink (Module modThis, string strSourceModuleFullname, string strLinkModuleFullName)
{
    intNoOfLinked = 0

    for objTarget in modThis do
    {
        recurseFollowInLinks(objTarget)
    }

    print "The following " intNoOfLinked " objects have direct or indirect links of type " STR_LINK_MOD_FULLNAME " from formal module " STR_SRC_MOD_FULLNAME ":\n"

    for objTarget in skObjsWithDesiredSource do
    {
        print identifier(objTarget)
        print "\n"
    }
}


///////////////
// Main Program

checkObjectInNestedLink ((current Module), STR_SRC_MOD_FULLNAME, STR_LINK_MOD_FULLNAME)

closeSourceMods()
delete(skLinkedMods)
delete(skObjsWithDesiredSource)
...