'***Patrick Rutledge, Rational Support, 12/98 'This script creates dependencies from package bodies to package specifications, 'when they have the same name and are assigned to the same class but are in different 'subsystems. This is because, unlike when they are in the same subystem, Rose will 'not automatically generate a #include of the header in the body when C++ is generated 'for the class. It is written to work on selected classes and packages, but changing 'one line (as marked) will make it check the whole model Dim gDependsMade As Integer 'GetAllSelectedClasses returns a collection of all selected classes and 'all classes in selected packages Function GetAllSelectedClasses() As ClassCollection Dim allClasses As New ClassCollection Dim cats As CategoryCollection Dim classes As ClassCollection Set cats = RoseApp.CurrentModel.GetSelectedCategories() For i% = 1 To cats.Count Set classes = cats.GetAt(i%).Classes For j% = 1 To classes.Count allClasses.Add classes.GetAt(j%) Next j% Next i% Set classes = RoseApp.CurrentModel.GetSelectedClasses() For i% = 1 To classes.Count allClasses.Add classes.GetAt(i%) Next i% Set GetAllSelectedClasses = allClasses End Function 'creates dependency from inFromSS to inToSS if it doesn't exist Sub CreateSubsysDependency (inFromSS As Subsystem, inToSS As Subsystem) Dim depends As ModuleVisibilityRelationshipCollection Dim aDepend As ModuleVisibilityRelationship Set depends = inFromSS.GetSubsystemDependencies(inToSS) For i% = 1 To depends.Count Set aDepend = depends.GetAt(i%) If aDepend.SupplierModule.name = inToSS.Name Then Exit Sub End If Next i% Set newDepend = inFromSS.AddSubsystemVisibilityRelationship(inToSS) RoseApp.WriteErrorLog "Created dependency from " & inFromSS.name & " to " & inToSS.name End Sub 'Creates dependency from inBody to inSpec if it doesn't exist Sub CreateModDependency (inBody As Module, inSpec As Module) Dim depends As ModuleVisibilityRelationshipCollection Dim aDepend As ModuleVisibilityRelationship Set depends = inBody.GetDependencies() For i% = 1 To depends.Count Set aDepend = depends.GetAt(i%) If aDepend.SupplierModule.name = inSpec.Name Then Exit Sub End If Next i% 'can't make a dependency between components unless their parents have one CreateSubsysDependency inBody.ParentSubsystem, inSpec.ParentSubsystem Set newDepend = inBody.AddVisibilityRelationship(inSpec) gDependsMade = gDependsMade + 1 fromName$ = inBody.ParentSubsystem.name & "::" & inBody.name toName$ = inSpec.ParentSubsystem.name & "::" & inSpec.name RoseApp.WriteErrorLog "Created dependency from " & fromName$ & " to " & toName$ End Sub 'finds components assigned to this class which have same name but are in 'different subsystems and creates a dependency from the body to the spec; 'WARNING: assumes there are not 3 components with the same name assigned to 'this class, or two packages or two bodies with the same name asigned to this class Sub Dependify (inClass As Class) Dim theMods As ModuleCollection Dim mod1 As Module Dim mod2 As Module 'get assigned modules Set theMods = inClass.GetAssignedModules() For i% = 1 To theMods.Count 'get next module Set mod1 = theMods.GetAt(i%) 'search rest of collection for module with same name For k% = i% To theMods.Count If theMods.GetAt(k%).name = mod1.name Then Set mod2 = theMods.GetAt(k%) If mod1.ParentSubsystem Is Not mod2.ParentSubsystem Then If mod1.Part = "Body" Then CreateModDependency mod1, mod2 Else CreateModDependency mod2, mod1 End If End If End If Next k% Next i% End Sub Sub Main Dim theClasses As ClassCollection Dim aClass As Class gDependsMade = 0 RoseApp.WriteErrorLog "" RoseApp.WriteErrorLog "Making dependencies" Set theClasses = GetAllSelectedClasses() 'use the following line instead for all classes instead of selected 'Set theClasses = RoseApp.CurrentModel.GetAllClasses() For i% = 1 To theClasses.Count Set aClass = theClasses.GetAt(i%) Dependify aClass Next i% RoseApp.WriteErrorLog "Made " & gDependsMade & " dependencies." MsgBox "Done. See log for details." End Sub