如何强制IBM DOORS刷新对象属性并解决DXL循环值未更新问题
解决IBM DOORS DXL遍历模块时
previous()失效的问题 问题根源
DOORS的for o in m do循环在遍历模块对象时,会对对象引用做内部缓存,导致previous(Object o)无法实时获取当前迭代对象的前一个对象,始终返回初始值,这就没法判断连续对象是否同类,自然每次都会生成新的longtable。
替代循环方式:索引遍历
不用for-in循环,改用基于对象索引的遍历,直接通过索引值获取当前和前一个对象,完全避开previous()函数的问题,逻辑和你熟悉的VBA遍历集合的方式类似。
示例代码
// 获取当前打开的模块 Module m = current Module() if (null m) { print "请先打开一个模块!\n" exit } // 获取模块内对象总数 int totalObjs = number(m) Object currObj, prevObj bool isFirstTable = true string currType, prevType // 按索引遍历每个对象(DOORS对象索引从1开始计数) for (int i = 1; i <= totalObjs; i++) { currObj = object(i, m) currType = currObj."Object Type" // 替换成你用来判断"同类"的属性 if (i > 1) { prevObj = object(i-1, m) prevType = prevObj."Object Type" // 判断当前对象和前一个是否同类 if (currType != prevType) { // 不同类,结束上一个longtable print "\\end{longtable}\n\n" isFirstTable = false } } // 如果是第一个对象,或者当前对象和前一个不同类,新建longtable if (i == 1 || currType != prevType) { print "\\begin{longtable}{|l|p{10cm}|}\n" print "\\hline\n" print "序号 & 内容 \\\\\n" // 替换成你的tex表头 print "\\hline\n" print "\\endfirsthead\n" print "\\hline\n" print "序号 & 内容 \\\\\n" // 续页表头 print "\\hline\n" print "\\endhead\n" } // 写入当前对象内容到longtable print i " & " currObj."Object Text" " \\\\\n" // 替换成你要导出的属性 print "\\hline\n" } // 结束最后一个longtable if (totalObjs > 0) { print "\\end{longtable}\n" }
关键说明
- 索引获取对象:
object(i, m)直接通过索引i获取模块m中的第i个对象,每次都是全新的对象引用,不会有缓存问题 - 同类判断:代码里用
Object Type属性判断是否同类,你可以替换成实际用来分组的自定义属性 - tex输出逻辑:每次遇到不同类的对象就关闭上一个
longtable并新建,同类对象则继续写入当前表格,完全符合你的需求
内容的提问来源于stack exchange,提问作者Dr. K. Sol
相关产品推荐
相关产品推荐

