Altova UModel 2024

The following JScript sample creates a new UModel project, creates some classes and generates code.

 

This code is available in the sample file ..\UModelExamples\API\JScript\UModelCreateCode.js (see Example Files).

 

// ###########################################
// 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
 
 

© 2017-2023 Altova GmbH