Im unten aufgelisteten JScript-Code wird ein neues UModel-Projekt erstellt, einige Klassen erstellt und Code generiert.
Dieser Code steht in der Beispieldatei ..\UModelExamples\API\JScript\UModelCreateCode.js zur Verfügung (siehe auch Beispieldateien).
// ########################################### // access runing UModel.Application or // launch new one and access it // ############################################ // ############################################ // CreateCode sample // shows forward engineering from scratch // it creates some coding elements in a new UModel project and generates code (saving the project afterwards) // ############################################ // //////////// global variables ///////////////// var objUModel = null; var objWshShell = null; var objFSO = null; // /////////////////////// Helpers ////////////////////////////// function Exit(strErrorText) { WScript.Echo(strErrorText); if (objUModel != null) objUModel.Quit(); WScript.Quit(-1); } function CreateGlobalObjects () { // the Shell and FileSystemObject of the windows scripting host often always useful try { objWshShell = WScript.CreateObject("WScript.Shell"); objFSO = WScript.CreateObject("Scripting.FileSystemObject"); } catch(err) { Exit("Can't create WScript.Shell object"); } // create the UModel connection // if there is a running instance of UModel (that never had a connection) - use it // otherwise, we automatically create a new instance try { objUModel = WScript.GetObject("", "UModel.Application"); } catch(err) {} if( typeof( objUModel ) == "undefined" ) { try { objUModel = WScript.GetObject("", "UModel_x64.Application") } catch(err) { objUModel = null; Exit( "Can't access or create UModel.Application" ); } } } function GetSourceCodeDirectory() { // get directory for source code var path = objUModel.PersonalDataDirectory + "\\UModelExamples\\API\\JScript\\CreateCode"; var codeDirectory = objFSO.BuildPath( path, "SampleCode" ); return codeDirectory; } function GetUMPFilePath() { // get file path to save UModel projectfile return objUModel.PersonalDataDirectory + "\\UModelExamples\\API\\JScript\\CreateCode\\CreateCode.ump"; } function IncludeCSharpProfile( objDocument ) { try { // get dialog for including subprojects: var objIncludeSubProjectDialog = objUModel.Dialogs.IncludeSubprojectDlg; objIncludeSubProjectDialog.ProjectFile = objUModel.InstallationDirectory + "\\UModelInclude\\c# Profile.ump"; return objDocument.IncludeSubproject( objIncludeSubProjectDialog ); } catch(err) { Exit("Can't include CSharp profile"); } } // /////////////////////// MAIN ////////////////////////////// CreateGlobalObjects(); objUModel.Visible = true; // open a new, empty document var objDocument = objUModel.NewDocument(); // get the root-package var objRootPackage = objDocument.RootPackage; if ( objDocument != null && objRootPackage != null && IncludeCSharpProfile( objDocument ) ) { // create coding elements try { // make all modifications within one UndoStep; start modification here if ( !objDocument.BeginModification() ) Exit("No modifications allowed"); // create a namespace root package var objCSharpRootNamespace = objRootPackage.InsertPackagedElementAt( -1, "Package" ); objCSharpRootNamespace.SetName( "CSharp" ); // find C# Profile... var objCSharpProfile = objRootPackage.FindPredefinedOwnedElement( 159, false );// ePredefined_CSharp_Profile = 159, // ...and apply it to the package, which is now a CSharp namespace root objCSharpRootNamespace.InsertProfileApplicationAt( -1, objCSharpProfile ); // create a C# namespace package... var objCSharpNamespace = objCSharpRootNamespace.InsertPackagedElementAt( -1, "Package" ); objCSharpNamespace.SetName( "Namespace1" ); // ... and apply the predefined C# namespace stereotype objCSharpNamespace.ApplyPredefinedStereotype( 223 ); // ePredefined_CSharp_namespaceStereotypeOfPackage = 223, // create new class within the C# namespace var objClass = objCSharpNamespace.InsertPackagedElementAt( -1, "Class" ); var objClass2 = objCSharpNamespace.InsertPackagedElementAt( -1, "Class" ); var objBaseClass = objCSharpNamespace.InsertPackagedElementAt( -1, "Class" ); objClass .SetName( "MyClass" ); objClass2 .SetName( "MyClass2" ); objBaseClass.SetName( "MyBaseClass" ); // set attribute-section "STAThread" var objAttributesStereotypeApplication = objClass.ApplyPredefinedStereotype( 191 );// ePredefined_CSharp_attributesStereotypeOfClass = 191 var objSTAThread = objCSharpProfile.FindPredefinedOwnedElement( 185, true ); // ePredefined_CSharp_AttributePresetsEnumeration_STAThreadEnumerationLiteral = 185 objAttributesStereotypeApplication.SetPredefinedTaggedValueAt(-1, 192, objSTAThread.Name); // ePredefined_CSharp_attributesStereotypeOfClass_sectionsProperty = 192 // insert new attribute var objProperty = objClass.InsertOwnedAttributeAt( -1 ); objProperty.SetName( "m_Att" ); objProperty.Visibility = 2; // eVisibility_Private = 2 objProperty.Type = objClass2; // insert new operation var objOperation = objClass.InsertOwnedOperationAt( -1 ); objOperation.SetName( "GetAtt" ); objOperation.Type = objClass2; // derive MyClass from MyBaseClass objClass.InsertGeneralizationAt( -1, objBaseClass ); // find the component view package var objComponentView = objRootPackage.FindPredefinedOwnedElement( 1, false );// ePredefined_ComponentViewPackage = 1 // create a new component for C# 3.0 and set the source code directory, where we want to generate the source code var objComponent = objComponentView.InsertPackagedElementAt( -1, "Component" ); objComponent.CodeLangVersion= 5; // eCodeLang_CSharp_3_0 = 5, objComponent.CodeProjectFileOrDirectory = GetSourceCodeDirectory(); objComponent.IsCodeProjectFile = false; // this component should realize our classes: objComponent.InsertRealizationAt( -1, objClass ); objComponent.InsertRealizationAt( -1, objClass2 ); objComponent.InsertRealizationAt( -1, objBaseClass ); // do not forget to end modification and finish UndoStep objDocument.EndModification(); } catch( err ) { // rollback made changes objDocument.AbortModification(); Exit("Error when creating UML model elements"); } // update code from model try { // explicitely run a syntax check if ( objDocument.CheckProjectSyntax() ) { // get dialog for code <=> model synchonizations and set the wanted options: var objSynchronizationSettingsDlg = objUModel.Dialogs.SynchronizationSettingsDlg; objSynchronizationSettingsDlg.CodeFromModel_Synchronization = 0; // eSynchronization_Merge = 0 objSynchronizationSettingsDlg.CodeFromModel_UserDefinedSPLTemplatesOverrideDefault = true; // update code from model if ( !objDocument.SynchronizeCodeFromModel( objSynchronizationSettingsDlg ) ) Exit("Update code from model failed"); } else Exit("Syntax check failed"); } catch( err ) { Exit("Error when updating code from model"); } // save project objDocument.SaveAs( GetUMPFilePath() ); WScript.Echo("Finished successfully"); } // if something went wrong (and we did not save the project), // we also do not want get asked for saving => set ModifiedFlag to false if ( objDocument != null ) objDocument.ModifiedFlag = false; objUModel.Visible = false; // will shutdown application if it was started by this script |