У меня почти нет опыта работы с 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
Сценарий устанавливает новое значение, но чтобы получить это новое значение, необходимо запустить сценарий второй раз, а не за один шаг.
Возможно, есть способоптимизировать его так, чтобы установка нового значения была в один шаг с копированием?