我创建了一个脚本,自动在各种包和元素之间创建连接。
我的问题是我多次运行脚本,因为没有检查以防止重复连接,我现在每个元素有10个重复的连接!
我需要
以下是我添加连接器的代码
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()
}
}
}
答案 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()
}
}