Configure your own default line styles in Enterprise Architect with EA-Matic

With EA-Matic you can develop add-ins for Enterprise Architect using the built-in scripting feature of EA.

With this EA-Matic script you can configure your own default line-styles depending on the type of connector.

In Enterprise Architect you can choose from no less then 9 different line style for the connectors.

Line Styles

Unfortunately you can only choose from the first three to be the default line style for new connectors.

line style default options

Additionally you can also specify the default for Generalization to be Tree Style.

For me that is not enough. I have my own habits when making UML diagrams. For most connector types I use Orthogonal – Square, but not for dependencies, use case relations and note links. For those I like the Direct style. The last exception are the control flow, state flow and object flows, for which I use Orthogonal – Rounded.

LineStylesDiagram

This EA-Matic script gives me the control I want. Not only does it set the default line style for new connectors, with the context menu I can reset all connectors on a diagram to my own default styles.

Free download

The code

In order to define your own preferred style you can edit the indicated part in the script

'*********EDIT BETWEEN HERE*************
' set here the menu name
menuDefaultLines = "&Set default linestyles"

' set here the default style to be used
defaultStyle = lsOrthogonalSquareTree

' set there the style to be used for each type of connector
function determineStyle(connector)
    dim connectorType
    connectorType = connector.Type
    select case connectorType
        case "ControlFlow", "StateFlow","ObjectFlow","InformationFlow"
            determineStyle = lsOrthogonalRoundedTree
        case "Generalization", "Realization", "Realisation"
            determineStyle = lsTreeVerticalTree
        case "UseCase", "Dependency","NoteLink"
            determineStyle = lsDirectMode
        case else
            determineStyle = defaultStyle
    end select
end function
'************AND HERE****************

This script uses 3 EA events. The first one is the EA_OnPostNewConnector which gets triggered by EA the moment you create  a new connector.

'the event called by EA
function EA_OnPostNewConnector(Info)
    'get the connector id from the Info
    dim connectorID
    connectorID = Info.Get("ConnectorID")
    dim connector 
    set connector = Repository.GetConnectorByID(connectorID)
    'get the current diagram
    dim diagram
    set diagram = Repository.GetCurrentDiagram()
    if not diagram is nothing then
        'first save the diagram
        Repository.SaveDiagram diagram.DiagramID
        'get the diagramlink for the connector
        dim diagramLink
        set diagramLink = getdiagramLinkForConnector(connector, diagram)
        if not diagramLink is nothing then
            'set the connectorstyle
            setConnectorStyle diagramLink, determineStyle(connector)
            'save the diagramlink
            diagramLink.Update
            'reload the diagram to show the link style
            Repository.ReloadDiagram diagram.DiagramID
        end if
    end if
end function

The next even we use is the EA_GetMenuItems so we can show a menu option in the context menu of a diagram.

'Tell EA what the menu options should be
function EA_GetMenuItems(MenuLocation, MenuName)
    if MenuName = "" and MenuLocation = "Diagram" then
        'Menu Header
        EA_GetMenuItems = menuDefaultLines
    end if 
end function

The last EA event is the EA_MenuClick, triggered when the user actually clicks on the menu item.

'react to user clicking a menu option
function EA_MenuClick(MenuLocation, MenuName, ItemName)
    if ItemName = menuDefaultLines then
        dim diagram 
        dim diagramLink
        dim connector
        dim dirty
        dirty = false
        set diagram = Repository.GetCurrentDiagram
        'save the diagram first
        Repository.SaveDiagram diagram.DiagramID
        'then loop all diagramLinks
        if not diagram is nothing then
            for each diagramLink in diagram.DiagramLinks
                set connector = Repository.GetConnectorByID(diagramLink.ConnectorID)
                if not connector is nothing then
                    'set the connectorstyle
                    setConnectorStyle diagramLink, determineStyle(connector)
                    'save the diagramlink
                    diagramLink.Update
                    dirty = true
                end if
            next
            'reload the diagram if we changed something
            if dirty then
                'reload the diagram to show the link style
                Repository.ReloadDiagram diagram.DiagramID
            end if
        end if
    end if
end function

Then we have a small helper function to get the diagramLink object from the diagram

'gets the diagram link object
function getdiagramLinkForConnector(connector, diagram)
    dim diagramLink 
    set getdiagramLinkForConnector = nothing
    for each diagramLink in diagram.DiagramLinks
        if diagramLink.ConnectorID = connector.ConnectorID then
            set getdiagramLinkForConnector = diagramLink
            exit for
        end if
    next
end function

And last but not least the method that will actually set the connector style.

'actually sets the connector style
function setConnectorStyle(diagramLink, connectorStyle)
    'split the style into its parts
    dim styleparts
    dim styleString
    styleString = diagramLink.Style
    styleparts = Split(styleString,";")
    dim stylePart
    dim mode
    dim modeIndex
    modeIndex = -1
    dim tree
    dim treeIndex
    treeIndex = -1
    mode = ""
    tree = ""
    dim i
    'find if Mode and Tree are already defined
    for i = 0 to Ubound(styleparts) -1 
        stylePart = styleparts(i)
        if Instr(stylepart,"Mode=") > 0 then
            modeIndex = i
        elseif Instr(stylepart,"TREE=") > 0 then
            treeIndex = i
        end if
    next
    'these connectorstyles use mode=3 and the tree
    if  connectorStyle = lsTreeVerticalTree or _
        connectorStyle = lsTreeHorizontalTree or _
        connectorStyle = lsLateralHorizontalTree or _
        connectorStyle = lsLateralVerticalTree or _
        connectorStyle = lsOrthogonalSquareTree or _
        connectorStyle = lsOrthogonalRoundedTree then
        mode = "3"
        tree = connectorStyle
    else
        mode = connectorStyle
    end if
    'set the mode value
    if modeIndex >= 0 then
        styleparts(modeIndex) = "Mode=" & mode
        diagramLink.Style = join(styleparts,";")
    else
        diagramLink.Style = "Mode=" & mode& ";"& diagramLink.Style
    end if
    'set the tree value
    if treeIndex >= 0 then
        if len(tree) > 0 then
            styleparts(treeIndex) = "TREE=" & tree
            diagramLink.Style = join(styleparts,";")
        else
            'remove tree part
            diagramLink.Style = replace(diagramLink.Style,styleparts(treeIndex)&";" , "")
        end if
    else
        diagramLink.Style = diagramLink.Style & "TREE=" & tree & ";"
    end if
end function

24 thoughts on “Configure your own default line styles in Enterprise Architect with EA-Matic

  1. Just another thing I missed a lot, which I could possibly develop for myself, but for which I never had the time to do. 🙂

    I simply can’t understand why the choice of line styles is restricted in the Options panel, but I’d bet they simply forger to extend it when newer styles became available.

    1. Yes indeed. I’m sure they know about it, and plan to extend the choices in the future, but I guess these type of change request often have to make room for more urgent changes.

  2. Some help please. I’ve imported the script to EA. EA-Matic correctly shows the monitored events and lists the event handler routines. Yet, if I create a line, it will default to what is set in EA options, instead of being of that style set for that kind of element. (More precisely, I am trying to link an actor with a use case, using the script default lsDirectMode for use cases..

    1. Hi,

      It looks like the script isn’t being triggered when you create a new connector. To make sure you can put a line such as
      MsgBox “the script has been triggered”
      in the EA_OnPostNewConnector(Info) function.

      If this doesn’t work I’m happy to have a look at the script if you send it to me by email.

      Geert

  3. Gonna send in an email, I’ve inserted a breakpoint at the beginning of a function, but that has not been triggered.

      1. That’s good to know! Now I guess you are reading the texts of scripts and putting them into eval() functions to have them executed. Don’t tell me if I figured it out correctly by any chance, that’s your trade secret. 😉

  4. Hi Geert

    I too am trying to recreate the above script.

    I’m getting “An error occurred while attempting to communicate with an Addin:” message when I select EA-Matic/Options. “EA_MenuClick: Method not found: ‘Boolean EAAddinFramework.EASpecific.Script.get_isStatic()’.”

    Hope you can help!

    Cheers
    Si

    1. Hi Simon,

      Can you confirm that
      – You have installed the latest version of EA-Matic (now part of the Bellekens EA Toolpack version 1.0.10)
      – You don’t have any previous versions of EA-Matic or EA Navigator still installed?

      It looks like it is using a part of the framework from an older version. That could happen if you still have an older version of EA-Matic or EA Navigator installed.

      Uninstalling all of my add-ins, and installed only the latest Bellekens EA Toolpack will probably sort this out.

      Let me know how it works out.

      Geert

  5. Hi Geert

    Many thanks for your speedy reply.

    I think I have solved the problem – I had an old EA Navigator installed. Have uninstalled everything and reinstalled and now seems to be working.

    Just need to get the script working- Is the full script available anywhere rather than just the fragments? Or can you tell me where lsOrthogonalSquareTree etc are defined?

    Cheers
    Si

      1. Brilliant!

        Many thanks. And thanks for making EA-Matic avaialble. A fantastic utility.

        Cheers
        Si

  6. Hi Geert,

    I am trying to set default line styles for the connectors using your EA-Matic script. I have downloaded the script and imported it into Enterprise architects from Project => Data Management => Import Reference Data. Now, how can i set the default line style to my diagram? How to proceed further?

      1. Hi Geert,
        Thanks for the quick replay. Now am able to set my default line style to all my connectors in my project. It really helped a lot geert. Thanks for your support.

  7. Hi Geert,

    I have downloaded the EA-Matic script into EA from Project => DataManagement => Import Reference Data. But i didn’t get any menu item like “EA-Matic” in Extensions menu. I am trying to set default line sytle to OrthogonalSquare. How to proceed further? Any help would be much appreciated.

    Thanks,
    Mohan

      1. Hi Geert,
        Thanks for the quick replay. Now, i have installed EA-Matic add-in and am able to set my default line style. It really helped a lot geert. Thanks for your support.

  8. Hello, Geert,
    This is a super add-in to EA!

    Could you help with the question:
    How to include to EA-matic-script my own script with the common functions?

    For example, this code doesn’t work:
    ———————————————————————————-
    _autoUpdate / testCommonFunction:

    !INC Local Scripts.EAConstants-JScript
    !INC MyTools.CommonFunctions

    function EA_OnPreDeleteConnector(Info)
    {
    commonTest(“_”)
    }
    //commonTest(“_”)

    ———————————————————————————-
    MyTools/CommonFunctions:

    function commonTest(x) {
    var el = Repository.GetElementByGuid(“{3E123F58-D758-4f9e-8E322-9029A8C632DD}”);
    el.Name = “tst ” + x
    el.Update()
    }

    ———————————————————————————-

    and generates the error, that commonTest() couldn’t be found.

    Run “_autoUpdate / testCommonFunction” from the original EA works fine (with the uncommented “commonTest(“_”)” ).

    Thank you.

    Best,
    Kelvin

Leave a Reply