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
25 replies
  1. imprestige
    imprestige says:

    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.

    Reply
    • Geert Bellekens
      Geert Bellekens says:

      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.

      Reply
  2. imprestige
    imprestige says:

    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..

    Reply
    • Geert Bellekens
      Geert Bellekens says:

      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

      Reply
  3. imprestige
    imprestige says:

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

    Reply
  4. Simon Perry
    Simon Perry says:

    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

    Reply
    • Geert Bellekens
      Geert Bellekens says:

      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

      Reply
  5. Simon Perry
    Simon Perry says:

    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

    Reply
  6. Mohan SB
    Mohan SB says:

    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?

    Reply
  7. Mohan SB
    Mohan SB says:

    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

    Reply
      • Mohan SB
        Mohan SB says:

        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.

        Reply
  8. Kelvin Y.
    Kelvin Y. says:

    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

    Reply
  9. Andrea
    Andrea says:

    Posting this to help those not so versed with EA-matic or how to load this script.

    Steps to load Default Line script:

    1. Download the default line script using the free download link on this page (do not try to cope/paste this code sections on this page and create your own script unless you know how because it will be missing stuff)

    2. save it to a local known location

    3. In EA go to Project|Data Management|Import Reference Data and choose the file you saved. You should see the script loaded under the ‘Model Scripts’ folder in your scripting area. If the folder was not there before it will create it. You can open the scripting area by going to Tools|Scripting

    4. Double click the script and edit the top portion as wanted for your preferences.

    5. Click save (YOU DO NOT NEED TO RUN).

    6. Go to Extensions|EA-Matic|Settings. Make sure the three wanted functions are checked and click OK you should not have to change anything but doing this reloads EA-Matic and the script. If you make any more changes do this again.

    7. You should be good to go to try out the connectors on your diagram.

    Reply

Trackbacks & Pingbacks

  1. […] styles to be set to your preferences automatically without having to run the script you can use EA-Matic version of this […]

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.