Установите новое значение одного атрибута, скопировав объект с помощью Links dxl DOORS - PullRequest
0 голосов
/ 13 июня 2019

У меня почти нет опыта работы с dxl DOORS, но теперь мне нужно скопировать объект со ссылками в одном модуле и установить новое значение одного из атрибутов путем копирования.Как я могу получить функцию копирования и установки нового значения сразу?

Я нашел код, который копирует выбранный объект с дочерними элементами в одном модуле в DOORS.Итак, я включил диалоговое окно для установки нового значения атрибута (например, Object Short Text).Это работает в целом, но довольно странно.

pragma runLim,0
Module m = current
string targetModuleString = "Name of the Module"
string sourceModuleString = "Name of the Module"
Module sourceModule = read(sourceModuleString, false)
Object oObjectToCopy = current(sourceModule)
Module targetModule = edit targetModuleString
Object oObjectAsAnchor = current(targetModule)

 // object to copy
Skip skpListOfObjsToCopy = create()
int iNumObjs = 0
 void getListOfObjsToCopy(Object o, bool bWithHierarchy)
{if ( null o ) { return }

// add this object to the list
put(skpListOfObjsToCopy, iNumObjs++, o)
if ( bWithHierarchy ) {

// add children
Object oChild
for oChild in o do {
getListOfObjsToCopy(oChild, bWithHierarchy) 
} 
} 
}

void copyListOfObjects(Module mTarget, Object oAnchor, bool bCreateBelow)
{ if ( null mTarget ) { 
return 
}
current = mTarget
// set up array of anchor objects
// (assume maximum number of levels is 100)

Object oAnchors[100]
int i
for i in 0:9 do {
oAnchors[i] = null Object 
}
Object oLastObjectCopied = null Object
Object oLastObjectCreated = null Object
// need to work out the difference in the levels between the two modules
int iLevelDifference = 0 
// create the objects
bool bFirstObject = true
Object oSource
for oSource in skpListOfObjsToCopy do {
// determine where to create the new object
Object oTarget = null Object
if ( null oAnchor ) {
// create new level 1 object
oTarget = create (mTarget)
 }

else if ( null oLastObjectCreated ) {
if ( bCreateBelow )
 {
oTarget = create(below oAnchor) }
else {
oTarget = create(after oAnchor) 
}
}

else {
// create in relation to previous objects
if ( level(oLastObjectCreated) < level(oSource) + iLevelDifference ) {
oTarget = create(below oAnchor) 
}

else
{ oTarget = create(after oAnchors[level(oSource)])
} 
}

oAnchor = oTarget
oLastObjectCreated = oTarget
oLastObjectCopied = oSource
if ( bFirstObject ) {
// level difference is worked after we have created the first new object
iLevelDifference = level(oLastObjectCreated) - level(oLastObjectCopied)
bFirstObject = false 
} 

// keep a record of last object created at every level
oAnchors[level(oLastObjectCreated)] = oLastObjectCreated
 oLastObjectCreated."Object Heading" = richText(richTextWithOle oLastObjectCopied."Object Heading")
oLastObjectCreated."Object Text" = richText(richTextWithOle oLastObjectCopied."Object Text")
} 
}

// main program
getListOfObjsToCopy(oObjectToCopy, true)
copyListOfObjects(targetModule, oObjectAsAnchor, false)
DB exBox = create "Parameter value"
DBE strngIn = field(exBox, "Value of the parameter:","Example", 20)
void doSet(DB exBox) {
string s = get strngIn 
(current Object)."Object Short Text" = s 
}
apply(exBox,"Get", doSet)
show exBox

Сценарий устанавливает новое значение, но чтобы получить это новое значение, необходимо запустить сценарий второй раз, а не за один шаг.

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

...