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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:22:40