EA 15.2自定义模板中如何按字母顺序排序源元素?
在Enterprise Architect 15.2中对连接器源元素按字母排序的解决方法
为什么默认排序不生效
你遇到的问题是因为通过connector > source > element遍历的元素是关联引用的元素,不属于当前元素/包的直接子元素集合,文档选项里的全局「Order By」筛选器只会作用于直接层级的元素(比如包内元素、元素的子元素),对这种通过连接器关联的元素不生效。
可行的解决方法
方法1:使用模板脚本区段手动收集并排序
EA的自定义模板支持插入脚本(JScript/VBScript),你可以通过脚本遍历当前元素的所有连接器,收集对应的源元素后按名称排序再输出。
修改后的模板结构如下(以JScript为例):
package > element > {Element.Name} script > // 收集当前元素所有连接器的源元素 var connectors = element.Connectors; var srcElements = []; for (var i = 0; i < connectors.Count; i++) { var conn = connectors.GetAt(i); var srcEl = Repository.GetElementByID(conn.SourceID); // 避免重复添加同一元素(如果多个连接器指向同一源) var exists = srcElements.some(el => el.ElementID === srcEl.ElementID); if (!exists) { srcElements.push(srcEl); } } // 按元素名称字母排序 srcElements.sort(function(a, b) { return a.Name.localeCompare(b.Name); }); // 输出排序后的元素信息 for (var j = 0; j < srcElements.length; j++) { var el = srcElements[j]; Session.Output(el.Name); if (el.Notes) { Session.Output(el.Notes); } } < script child elements > < child elements < element < package
注意事项:
- 在模板编辑器中,选中脚本区段后,要在右侧设置中选择对应的脚本语言(比如JScript)
- 脚本里的
element是模板当前上下文的元素对象,可直接调用EA的API方法 - 如果需要去重(同一源元素被多个连接器关联),可以通过
ElementID判断是否已添加
方法2:尝试区段内排序参数(仅部分场景生效)
如果不想用脚本,可以尝试在source下的element区段添加排序标记,不过这个方法仅对部分关联元素集合生效,不一定能解决你的问题,可作为备选:
package > element > {Element.Name} connector > source > element > {=Element.Name} {Element.Name} {Element.Notes} < element < source < connector child elements > < child elements < element < package
这里的{=Element.Name}是告诉EA按元素名称排序当前区段的元素,但因为是连接器关联的元素,可能不会触发排序逻辑,所以优先推荐脚本方法。
内容的提问来源于stack exchange,提问作者PB17
相关产品推荐
相关产品推荐

