如何用Velocity访问Cameo文件夹中的主Block元素?
问题描述
我的文件夹结构如下:
Folder ├─ Diagram ├─ Block1 ├─ Block2 │ └─ Subblock └─ Block3
我需要写一个Velocity循环,只访问主层级的Block(Block1、Block2、Block3),而且方法要通用,不能靠逐个判断名称来筛选。
我原本想通过访问Folder.inner_elements来筛选出所有Class类型(也就是我需要的Block元素),但尝试后报错了。我是Velocity和Cameo的新手,查文档没找到具体方法,只知道怎么访问所有Block。
尝试的代码
#foreach($folder in $Package) #if($folder.name == “Folder_name”) #set($des_folder = $folder) #end #end #set($elements = $des_folder.inner_elements) #foreach($block in $elements) $block.name #end
报错信息
WARN: [Report] No such property: inner_elements of package on mr.inner_elements
解决方案
1. 修正元素访问的属性名
Cameo/Enterprise Architect里的Package对象并没有inner_elements这个属性,你需要用标准UML属性ownedElements来访问包内的元素。
2. 通用筛选主层级Block的方法
要精准获取主层级的Block(排除子包、Diagram等无关元素),可以结合类型判断和层级检查:
#foreach($pkg in $Package) #if($pkg.name == "Folder_name") #foreach($element in $pkg.ownedElements) #if($element.stereotype == "Block" && $element.namespace == $pkg) $element.name #end #end #end #end
说明:
$element.stereotype == "Block":判断元素是否为Block类型(如果你的Block是基于UML Class加 stereotype定义的)$element.namespace == $pkg:确保元素是当前包的直接子元素,不会包含子包(比如Block2里的Subblock)内的元素
如果你的Block直接是UML Class类型,无需额外stereotype,把判断条件改成$element.class.simpleName == "Class"即可。
3. 更简洁的目标包定位写法
如果知道目标包的路径,也可以直接用$Project.findPackageByPath获取,不用遍历所有Package:
#set($targetPkg = $Project.findPackageByPath("Folder_name")) #foreach($element in $targetPkg.ownedElements) #if($element.stereotype == "Block" && $element.owner == $targetPkg) $element.name #end #foreach
内容的提问来源于stack exchange,提问作者Julia Sullivan
相关产品推荐
相关产品推荐

