Synchronize object and classifier name 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.
This example EA-Matic script keeps the names of objects synchronized with the name of their classifier.
When modelling with objects the name of the object is often left empty because it doesn’t have any significance at that point. One of the downsides of this practice is that in things like the traceability view, or in the links view the object shows up without a name, which of course doesn’t help much.
One of the solutions for this problem is to give the object the same name as its classifier. But that is a manual tedious process, and in case the classifier changes name you have the change the name of all the instances.
The script ensures that the name of the instances is always the same as the name of the classifier.
Usage of Enterprise Architect Add-in Framework
This script also illustrates how you can use the Enterprise Architect Add-in Framework within your script.
This extensive open source framework is the basis for the add-ins EA-Matic and EA Navigator, and offers a much more functional interface to the model then the standard EA API.
This code inializes the model object with the current Repository
'gets a new instance of the EAAddinFramework and initializes it with the EA.Repository
function getEAAddingFrameworkModel()
'Initialize the EAAddinFramework model
dim model
set model = CreateObject("TSF.UmlToolingFramework.Wrappers.EA.Model")
model.initialize(Repository)
set getEAAddingFrameworkModel = model
end function
It is then further used to get the element based on the GUID passed as parameter
set element = model.getElementWrapperByGUID(GUID)
The model element can be used to search elements based on an sql query
query = "select o.Object_ID from t_object o where o.classifier =" & element.id dim objects set objects = model.toArrayList(model.getElementWrappersByQuery(query))
Note that we need to use model.toArrayList to convert the C# List<>Â that cannot be used by VBScript to an ArrayList that can be used.
The code
Download the complete script: EA-Matic Sychronize object names
There are two events that we use. EA_OnNotifyContextItemModified to react to a name change of either the object or the classifier and EA_OnPostNewElement to change the name of a new object immediately after it has been created.
function EA_OnNotifyContextItemModified(GUID, ot)
dim model
set model = getEAAddingFrameworkModel()
'only do something when the changed object is an element
if ot = otElement then
dim element
set element = model.getElementWrapperByGUID(GUID)
synchronizeObjectNames element, model
end if
end function
function EA_OnPostNewElement(Info)
'Get the model
dim model
set model = getEAAddingFrameworkModel()
'get the elementID from Info
dim elementID
elementID = Info.Get("ElementID")
'get the element being deleted
dim element
set element = model.getElementWrapperByID(elementID)
synchronizeObjectNames element, model
end function
These two events then use the function synchronizeObjectNames to make sure the name of the object is the same as the name of the classifier
function synchronizeObjectNames(element, model)
'first check if this is an object
if element.WrappedElement.Type = "Object" AND element.WrappedElement.ClassifierID > 0 then
dim classifier
set classifier = model.getElementWrapperByID(element.WrappedElement.ClassifierID)
if not classifier is nothing AND classifier.name <> element.name then
element.name = classifier.name
element.save
end if
else
'get all objects having this element as their classifier
dim query
query = "select o.Object_ID from t_object o where o.classifier =" & element.id
dim objects
set objects = model.toArrayList(model.getElementWrappersByQuery(query))
'loop objects
dim obj
for each obj in objects
'rename the object if the name is different from the classifiers name
if obj.name <> element.name then
obj.name = element.name
obj.save
end if
next
end if
end function




Leave a Reply
Want to join the discussion?Feel free to contribute!