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.
Unfortunately you can only choose from the first three to be the default line style for new connectors.
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.
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
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.
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.
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..
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
Gonna send in an email, I’ve inserted a breakpoint at the beginning of a function, but that has not been triggered.
Breakpoint won’t work when the script is executed by EA-Matic. I’l have a look as the script you’ve sent.
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. 😉
There are no secrets here. EA-Matic is fully open source. You can consult the source code at https://github.com/GeertBellekens/Enterprise-Architect-Toolpack
I’m sure I will!
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
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
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
HI Simon,
Happy to see that you were able to resolve the issue.
You can download the full script from the downloads sections: https://bellekens.com/free-downloads/#!/EA-Matic-default-line-styles-script/p/48249914/category=12516650
The variables like lsOrthogonalSquareTree are defined somewhere at the beginning of the script.
Geert
Brilliant!
Many thanks. And thanks for making EA-Matic avaialble. A fantastic utility.
Cheers
Si
You’re welcome. I’m happy it’s being used.
Geert
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?
Hi,
The EA-Matic script needs the EA-Matic add-in to be installed in order to function.
You can download the EA-Matic installer from https://bellekens.com/ea-matic/
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.
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
Mohan,
Have you installed the add-in EA-Matic?
Without the add-in the script will not work.
Geert
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.
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
Hi Kelvin,
Make sure you include the string EA-Matic in all scripts that need to be used, so also the included scripts.
Geert
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.