2017-02-01 17 views
0

У меня есть модуль А с объектами связаны из объектов в другом модуле B. В свете А, У меня есть макет DXL столбец, который перечисляет все эти связанные объекты B:Листинг ссылки с целью вставки в рациональных ДВЕРЯХ

// DXL generated by DOORS traceability wizard on 02 May 2016. 
// Wizard version 2.0, DOORS version 9.2.0.5 
pragma runLim, 0 
string limitModules[1] = {"40fedbf2697f0e24-00003921"} 

void showIter(Object o, string linkModName, int depth, string build, string iter) { 
     Link l 
     Object othero 
     for l in all(o<-linkModName) do { // **** 
      otherVersion = sourceVersion l 
      otherMod = module(otherVersion) 
      if (null otherMod || isDeleted otherMod) continue 
      if (!equal(getItem otherMod, (itemFromID limitModules[depth-1]))) continue 
      othero = source l 
      if (null othero) { 
       load(otherVersion,false) 
      } 
      othero = source l 
      if (null othero) continue 
      if (isDeleted othero) continue 
      doneOne = true 
      if (depth == 1) { 
       disp = "" 
       obuild = probeRichAttr_(othero,"Build", false) 
       oiter = probeRichAttr_(othero,"Iteration (planned)", false) 
       string ocat = othero."Category" 
       if (obuild == build && oiter == iter) { 
        s = "(B" obuild "." oiter " - " ocat[0] ") " (identifier othero) 
        disp = disp s 
        s = probeRichAttr_(othero,"Object Text", false) 
        disp = disp " " s 
        displayRich("\\pard " disp) 
       } 
      } 
     } 
} 

void showIn(Object o, int depth) { 
    Link l 
    LinkRef lr 
    ModName_ otherMod = null 
    Module linkMod = null 
    ModuleVersion otherVersion = null 
    Object othero 
    string disp = null 
    string s = null 
    string plain, plainDisp 
    int plainTextLen 
    int count 
    bool doneOne = false 
    Item linkModItem = itemFromID("40fedbf2697f0e24-000039a3") 
    if (null linkModItem) { 
     displayRich("\\pard " "<<Link module not found>>") 
    } else if (type(linkModItem) != "Link") { 
     displayRich("\\pard " "<<Invalid link module index for this database>>") 
    } else { 
     string linkModName = fullName(linkModItem) 
     for lr in all(o<-linkModName) do { 
      otherMod = module (sourceVersion lr) 
      if (!null otherMod) { 
       if ((!isDeleted otherMod) && (null data(sourceVersion lr))) { 
        if (!equal(getItem otherMod, (itemFromID limitModules[depth-1]))) continue 
        load((sourceVersion lr),false) 
       } 
      } 
     } 
     //showIter(o, linkModName, depth, "1", "") 
     //showIter(o, linkModName, depth, "2", "") 
     showIter(o, linkModName, depth, "3", "3") 
    } 
} 
showIn(obj,1) 

Этот скрипт перечисляет связанные объекты в числовом порядке объекта ID/ключ:

B object with ID# 3 
B object with ID# 8 
B object with ID# 21 
B object with ID# 24 

Однако в модуле B, без каких-либо сортировки активна, объекты видимы в порядке вставки, как это (т.е. согласно где я сделал вставку):

B object with ID# 24 
B object with ID# 8 
B object with ID# 21 
B object with ID# 3 

Есть ли способ, чтобы петли над объектами B с целью вставки, то есть для того, что они будут отображаться в виде B при отсутствии сортировки не активна?

ответ

0

«Естественный» порядок, как вы его определяете, - это порядок, в котором исходные объекты появляются в исходном модуле. Это не распространяется на случаи, когда исходные объекты поступают из разных модулей, но это еще одна проблема.

Цикл «.. для l in ....» по определению не определен, поэтому на случай, если вы нужно одно, вы должны определить свой собственный заказ. В DXL это обычно делается списками Skip.

Вы можете создать список пропусков с ключом типа integer или string и значением типа Link. Затем для каждой ссылки вы можете как-то рассчитать правильный порядок и добавить запись, в которой ключ представляет заказ в списке пропуска. Более поздний цикл «для l в skip» будет обрабатывать список пропусков в порядке ключей.

В вашем случае, вы можете вычислить ключ, используя цикл по всем объектам источника, с помощью временного списка пропуска, как

int order = 0 
Skip skOrderOfObject = create() 
Object o 
for o in entire (... source module...) do { 
    order ++ 
    int absno = o."Absolute Number" 
    put (skOrderOfObject, order, absno) 
} 

Затем обработать каждый исходный объект в столбце DXL, вы можете сделать

Skip skMySortedLinks = create() 
... 
for l in... { 
    Object oSource = source l 
    int iOrderOfThisObject 
    int absnoOfSource = oSource."Absolute Number" 
    find (skOrderOfObject, absnoOfSource, iOrderOfThisObject); 
    put (skMySortedLinks, iOrderOfThisObject, l) 
} 

и, наконец,

Link l 
for l in skMySortedLinks do { 
    ... print whatever you want to print... 
} 
+0

Под «естественным» я имел в виду порядок, они появляются, когда вы откройте модуль, когда сортировка отключена, то есть порядок вставки. Порядок цикла в DXL определяется идентификатором объекта. Я обновил свой ответ, пожалуйста, взгляните еще раз, потому что список пропусков вряд ли будет практическим решением AFAICT. – Schollii

+0

обновил мое сообщение после повторного чтения вашего вопроса. Список пропусков может выглядеть не слишком элегантно или быстро, но я не вижу другого решения. Порядок, в котором ссылки «появляются» в целевом модуле не имеют связи с порядком, в котором исходные объекты существуют в исходном модуле, поэтому вам нужно вставить свою собственную логику. – Mike

+0

Интересно. Основное предположение заключается в том, что 'for o в целом (... source module ...) выполняет итерации по объектам в порядке размещения, т. Е. В порядке их появления в модуле. Я попробую это. Одна вещь: из 3 частей кода, который вы перечисляете, первый должен быть только один раз для модуля B, но возможно ли это? Если я положил первую часть в столбце A DXL, skOrderOfObject будет регенерирован для * каждого объекта * A (который имеет ссылки из B). – Schollii

 Смежные вопросы

  • Нет связанных вопросов^_^