удалить соединители sparx с помощью jscript

Я создал скрипт, который автоматически создает соединения между различными пакетами и элементами.

Моя проблема в том, что я запускал скрипт несколько раз, и, поскольку не было проверки для предотвращения дублирования соединений, у меня теперь есть 10 дубликатов соединений для каждого элемента!

Мне необходимо

  1. удалить их все
  2. найти способ проверить, существуют ли соединения, прежде чем создавать их в будущем

Вот мой код для добавления соединителей

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()
      } 
  }
}

person user391986    schedule 08.05.2014    source источник
comment
На первый взгляд, я думаю, вам нужно переместить Update() за пределы цикла for, так как это может повлиять на счетчик цикла. Кроме того, вам может понадобиться цикл назад от Count-1 до 0, если Delete() вызывает перенумерацию коллекции.   -  person chimp    schedule 08.05.2014
comment
Если я правильно прочитал этот вопрос, вам также нужна помощь в обеспечении того, чтобы не создавались повторяющиеся соединители. Если да, пожалуйста, выделите эту часть в отдельный вопрос, так как он не охватывается заголовком этого вопроса.   -  person Uffe    schedule 09.05.2014


Ответы (1)


Как отметил шимпанзе в своем комментарии, удаление элемента в коллекции перенумеровывает оставшиеся элементы (после того, как вы удалили). Поэтому зацикливание от 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()
    }
}
person Uffe    schedule 09.05.2014