Modélisation UML & SysML

Expertise et articles Blog sur UML, SysML, et Enterprise Architect de Sparx Systems

english versionTwitterUMLChannel SparxSystems EA YouTube videosLinkedIn
mercredi, 09 avril 2014 00:00

Trier les éléments d'un paquetage par alias ou par une tagged value avec les scripts Project Browser de Sparx Enterprise Architect

Écrit par
Évaluer cet article
(0 Votes)

Important :

  • Le script SortByAlias a été amélioré et mis à jour le 1/09/2014 afin de fonctionner lorsque des éléments du paquetage comportent des alias vides.
  • Les fonctions de ce script sont désormais intégrées et maintenues dans l'add-in eaUtils ; cliquer ici pour plus d'informations.

J'ai récemment travaillé sur un nouveau projet Enterprise Architect dans lequel j'ai importé les exigences initiales à partir d'un fichier Excel avec eaDocX. Chacune des exigences comportait alors les informations suivantes sous Enterprise Architect : titre, référence (importée dans le champ Alias), description. Par défaut, Sparx Enterprise Architect tri le nom des exigences d'un paquetage sélectionné par ordre alphabétique. Lorsqu'un paquetage contient plusieurs types d'éléments (ex : classes, interfaces, cas d'utilisations, exigences, etc.), chaque groupe d'éléments du même type est trié séparément. La capture d'écran suivante présente un paquetage possédant un mélange d'exigences, de classes, et d'interfaces, triées par type puis par nom dans l'ordre alphabétique :

sparx enterprise architect project browser

 

Après avoir importé mes exigences, j'avais besoin de les trier par alias (exemple : REQ-TEST-001, REQ-TEST-002, REQ-TEST-003, etc). La capture d'écran suivante illustre sur la partie gauche les exigences affichées dans l'explorateur du projet (Project Browser), et sur la partie droite l'ordre d'affichage souhaité i.e. triées par alias. 

sparx enterprise architect project browser sort by script

 

Le script présenté dans cet article permet de trier les éléments d'un paquetage sélectionné par alias. Un script supplémentaire est disponible en fin d'article pour trier les éléments d'un paquetage sélectionné selon la valeur d'une Tagged Value dédiée à ce besoin, nommée "SortingOrder".

Scripts Enterprise Architect de type "Project Browser"

Les scripts présentés dans cet article sont de type "project browser". Ils présentent en effet la spécificité d'être accessibles via un clic droit sur un paquetage sélectionné à partir de l'explorateur (project browser), comme représenté ci-dessous :

sparx systems enterprise architect project browser script

 

Script "Sort by alias" pour trier les éléments d'un paquetage par alias

La procédure suivante décrit les étapes nécessaires pour installer puis utiliser le script SortByAlias :

Étape 1: ouvrir la vue "scripting" à partir du menu Tools > Scripting.

Étape 2: cliquer sur "New Project Browser Group" pour créer un groupe dédié aux scripts utilisateurs de type Project Browser, par exemple Project Browser scripts.

Étape 3: cliquer sur "new script > new VBScript" pour créer le script de tri par alias, par exemple SortByAlias.

sparx enterprise architect project browser script sortbyalias

Étape 4: ouvrir le nouveau script (vide) et copier/coller le contenu suivant (alternative :  télécharger le fichier VBScript). 

  1. option explicit
  2. !INC Local Scripts.EAConstants-VBScript
  3. '
  4. ' Script Name: SortbyAlias
  5. ' Author: Guillaume FINANCE, guillaume[at]umlchannel.com
  6. ' Purpose: Sort elements contained in the selected package from the Project Browser by the Alias name
  7. ' Date: 03/04/2014, updated on the 1/09/2014 (works when the package contains empty aliases, using Session.Output)
  8. '
  9. sub SortDictionary (objDict)
  10. ' constants
  11. Const dictKey = 1
  12. Const dictItem = 2
  13. ' variables
  14. Dim strDict()
  15. Dim objKey
  16. Dim strKey,strItem
  17. Dim X,Y,Z
  18. ' get the dictionary count
  19. Z = objDict.Count
  20. ' sorting needs more than one item
  21. If Z > 1 Then
  22. ' create an array to store dictionary information
  23. ReDim strDict(Z,2)
  24. X = 0
  25. ' populate the string array
  26. For Each objKey In objDict
  27. strDict(X,dictKey) = CStr(objKey)
  28. strDict(X,dictItem) = CStr(objDict(objKey))
  29. X = X + 1
  30. Next
  31. ' perform a a shell sort of the string array
  32. For X = 0 To (Z - 2)
  33. For Y = X To (Z - 1)
  34. If StrComp(strDict(X,dictItem),strDict(Y,dictItem),vbTextCompare) > 0 Then
  35. strKey = strDict(X,dictKey)
  36. strItem = strDict(X,dictItem)
  37. strDict(X,dictKey) = strDict(Y,dictKey)
  38. strDict(X,dictItem) = strDict(Y,dictItem)
  39. strDict(Y,dictKey) = strKey
  40. strDict(Y,dictItem) = strItem
  41. End If
  42. Next
  43. Next
  44. ' erase the contents of the dictionary object
  45. objDict.RemoveAll
  46. ' repopulate the dictionary with the sorted information
  47. For X = 0 To (Z - 1)
  48. objDict.Add strDict(X,dictKey), strDict(X,dictItem)
  49. Next
  50. ' sort the package elements based on the new sorting order
  51. dim newOrder
  52. newOrder = 0
  53. dim eaelement
  54. for each objKey in objDict
  55. Set eaelement = Repository.GetElementByGuid(objKey)
  56. 'change the position of the element in the package to the new sorting order value
  57. eaelement.TreePos = CLng(newOrder)
  58. eaelement.Update()
  59. newOrder = newOrder + 1
  60. next
  61. end if
  62. end sub
  63. sub sortElementsbyAlias (selectedPackage)
  64. Session.Output("Processing selected package " & selectedPackage.Name)
  65. dim elements as EA.Collection
  66. dim i
  67. dim processedElements
  68. set processedElements = CreateObject( "Scripting.Dictionary" )
  69. set elements = selectedPackage.Elements
  70. for i = 0 to elements.Count - 1
  71. dim currentElement as EA.Element
  72. set currentElement = elements.GetAt( i )
  73. Session.Output("Processing element " & i & " with type " & currentElement.Type & ", alias """ & currentElement.Alias & """ and guid " & currentElement.ElementGUID & ")")
  74. processedElements.Add currentElement.ElementGUID, currentElement.Alias
  75. next
  76. Session.Output("Sorting package elements")
  77. SortDictionary processedElements
  78. end sub
  79. '
  80. ' Project Browser Script main function
  81. '
  82. sub OnProjectBrowserScript()
  83. Repository.ClearOutput "Script"
  84. Session.Output( "Starting SortbyAlias script" )
  85. Session.Output( "==============================" )
  86. ' Get the type of element selected in the Project Browser
  87. dim treeSelectedType
  88. treeSelectedType = Repository.GetTreeSelectedItemType()
  89. select case treeSelectedType
  90. case otPackage
  91. ' Code for when a package is selected
  92. dim thePackage as EA.Package
  93. set thePackage = Repository.GetTreeSelectedObject()
  94. sortElementsbyAlias thePackage
  95. Repository.RefreshModelView (thePackage.PackageID)
  96. case else
  97. ' Error message
  98. Session.Prompt "This script does not support items of this type.", promptOK
  99. end select
  100. end sub
  101. OnProjectBrowserScript

Étape 5: enregistrer le script (ctrl-S).

Étape 6: lancer un clic droit sur le paquetage cible dans lequel les éléments doivent être triés par alias, puis sélectionner Scripts > SortbyAlias

Résultat : les exigences (éléments de type "requirement") du paquetage sélectionné ont été triées par ordre alphabétique à partir du champ alias.

sparx-enterprise-architect-project_browser_script_sortbyalias_running result

L'ordre d'affichage obtenu dans l'explorateur du projet correspond bien aux alias des exigences :

sparx enterprise architect project_browser_script_sortbyalias done

Script "Sort by tagged value - sortingorder" pour trier les éléments d'un paquetage selon une tagged value dédiée

Dans certains cas, il n'est pas possible d'utiliser le champ Alias pour trier les exigences. Aussi je suis parti du script SortByAlias pour créer le script SortbyTaggedValue_SortingOrder, dont l'objectif est de trier les éléments d'un paquetage selon la valeur d'une "tagged value", SortingOrder, créée spécialement pour ce besoin.

Afin de tester ce script, j'ai créé la tagged value SortingOrder dans chaque exigence :

sparx enterprise architect project_browser_script_sortby tagged value

La procédure suivante décrit les étapes nécessaires pour installer puis utiliser le script SortbyTaggedValue_SortingOrder :

Étape 1: ouvrir la vue "scripting" à partir du menu Tools > Scripting.

Étape 2: ouvrir le groupe de scripts Project Browser intitulé Project Browser scripts (créé précédemment).

Étape 3: cliquer sur "new script > new VBScript" pour créer le script de tri par tagged value, par exemple SortbyTaggedValue_SortingOrder.

Étape 4: ouvrir le nouveau script (vide) et copier/coller le contenu du fichier téléchargeable ici

Étape 5: enregistrer le script (ctrl-S).

Étape 6: lancer un clic droit sur le paquetage cible dans lequel les éléments doivent être triés par la valeur de SortingOrder, puis sélectionner Scripts > SortbyTaggedValue_SortingOrder.

sparx enterprise architect project_browser_script_sortby tagged value open

 


Résultat : les exigences (éléments de type "requirement") du paquetage sélectionné ont été triées selon le valeur de la tagged value SortingOrder.

sparx enterprise architect project_browser_script_sortby tagged value result

 

Remarque : les scripts SortByAlias et SortByTaggedValue pourraient à l'avenir être améliorés afin de trier également les éléments de chaque sous-paquetage.

Cet article a démontré que l'outil Sparx Enterprise Architect est ouvert et permet par différents moyens d'être adapté en créant par exemple de nouvelles fonctionnalités afin de répondre aux besoins de divers contextes. En effet Enterprise Architect permet de créer des scripts tels que SortByAlias ou SortByTaggedValue présentés dans cet article, ou pour importer en masse des fichiers XMI présenté dans un précédent article, ou encore d'implémenter des extensions / add'ins dot net C#.