You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制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"
}

关键说明

  1. 索引获取对象:object(i, m)直接通过索引i获取模块m中的第i个对象,每次都是全新的对象引用,不会有缓存问题
  2. 同类判断:代码里用Object Type属性判断是否同类,你可以替换成实际用来分组的自定义属性
  3. tex输出逻辑:每次遇到不同类的对象就关闭上一个longtable并新建,同类对象则继续写入当前表格,完全符合你的需求

内容的提问来源于stack exchange,提问作者Dr. K. Sol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:18:23