用jscript删除sparx连接器

时间:2014-05-08 03:10:31

标签: apache-spark enterprise-architect

我创建了一个脚本,自动在各种包和元素之间创建连接

我的问题是我多次运行脚本,因为没有检查以防止重复连接,我现在每个元素有10个重复的连接!

我需要

  1. 全部删除
  2. 找到一种方法来检查在将来创建连接之前是否已存在连接
  3. 以下是我添加连接器的代码

    function AddC(myDiagramObject, myPackageObject, myElementObject) {
        source = Repository.GetElementByID(myPackageObject.ElementID)
        target = Repository.GetElementByID(myElementObject.ElementID)
        association = source.Connectors.AddNew("", "Dependency")
        association.SupplierID = target.ElementID
        association.Stereotype = "Requirement"
        association.Update()
        Repository.ReloadDiagram(myDiagramObject.DiagramID)
    }
    

    这是我的代码无法删除连接器

    function DeleteC(diagramObject)
    {
      for(var c = 0; c < diagramObject.DiagramObjects.Count; c++)
      {
        var currentObject = diagramObject.DiagramObjects.GetAt(c)
          for (var d = 0; d < currentObject.Connectors.Count; d++) {
            currentObject.Connectors.Delete(d)
            currentObject.Update()
          } 
      }
    }
    

1 个答案:

答案 0 :(得分:0)

正如黑猩猩在他的评论中指出的那样,删除集合中的元素会重新编号其余元素(在您删除的元素之后)。因此,在不考虑这一点的情况下从0向上循环是有风险的。从Count-1循环到0更好。

如果您要删除所有连接器,则更简洁的方法是每次循环while Count > 0并执行Delete(0)

更重要的是,看起来您的代码无法按照书面形式工作。 Diagram有一个DiagramObjects集合,但DiagramObject没有Connectors集合 - 只有Element集合。

正如您所看到的,当API中的类也称为“对象”时,包含变量名中的“对象”一词的命名约定会让人感到困惑。但是,遵循这一惯例,以下内容应该有效:

function DeleteC(diagramObject)
{
    for (var c = 0; c < diagramObject.DiagramObjects.Count; c++)
    {
        var currentDiagramObjectObject = diagramObject.DiagramObjects.GetAt(c)
        var currentElementObject =
            repository.GetElementByID(currentDiagramObjectObject.ElementID)
        while (currentElementObject.Connectors.Count > 0) {
            currentElementObject.Connectors.Delete(0)
            currentElementObject.Connectors.Refresh()
        } 
        currentElementObject.Update()
    }
}