using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Eugen.NX.Version
{
class NxVersion
{
///
/// UGII_BASE_DIR. E.g.: C:\Program Files\Siemens\NX 10.0
///
public string Ugii_base_dir { get; set; }
#region Define Type
///
/// NX Version. E.g.: NX 10.0.3.5
///
public string NXversion { get; set; }
///
/// NX Patch. E.g.: NX 10.0.3.5 MP4
///
public string NXpatch { get; set; }
///
/// UGII_PRODUCT_NAME. E.g.: NX of NX 10.0.3.5
///
public string UgiiProductName { get; set; }
///
/// UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5
///
public int UgiiMajorVersion { get; set; }
///
/// UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5
///
public int UgiiMinorVersion { get; set; }
///
/// UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5
///
public int UgiiSubminorVersion { get; set; }
///
/// NX Phase. E.g.: 5 of NX 10.0.3.5
///
public int NXphase { get; set; }
///
/// UGII_FULL_VERSION. E.g.: v10.0.3.5 instead of NX 10.0.3.5
///
public string UgiiFullVersion { get; set; }
///
/// UGII_VERSION. E.g.: v10 of v10.0.3.5
///
public string UgiiVersion { get; set; }
///
/// NX_VERSION_STRING. E.g.: V28.0.3.5 instead of NX 10.0.3.5 MP4
///
public string NxVersionString { get; set; }
///
/// NX_MAJOR_STRING. E.g.: V28 of V28.0.3.5
///
public string NxMajorVersionString { get; set; }
///
/// NX_MINOR_STRING. E.g.: 0 of V28.0.3.5
///
public string NxMinorVersionString { get; set; }
///
/// NX_SUBMINOR_STRING. E.g.: 3 of V28.0.3.5
///
public string NxSubminorVersionString { get; set; }
///
/// NX_PHASE_STRING. E.g.: 5 of V28.0.3.5
///
public string NxPhaseString { get; set; }
///
/// Maintenance Release. E.g.: 10.0.3.5 of NX 10.0.3.5 MP4
///
public string MaintenanceRelease { get; set; }
///
/// Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4
///
public string MaintenancePack { get; set; }
///
/// Maintenance Pack Number. E.g.: 4 of NX 10.0.3.5 MP4
///
public int MaintenancePackNumber { get; set; }
#endregion
#region GetVersion
///
/// Assign values to a NX Version.
///
/// A valid UGII_BASE_DIR.
/// A full defined NX Version.
public NxVersion GetNxVersion(string ugii_base_dir)
{
NxVersion nxVersion = new NxVersion();
string tempVersion = "";
string tempPatchText = "";
if (Directory.Exists(ugii_base_dir))
{
tempVersion = ReadProcessOutput(ugii_base_dir, "-n"); //Prozess mit env_print.exe -n aufrufen
tempPatchText = ReadProcessOutput(ugii_base_dir, "-m"); //Prozess mit env_print.exe -n aufrufen
//Wert auflösen und in den Variablen ablegen
AlignCode(tempVersion, tempPatchText);
return AssignVersion(); //Werte zuordnen
}
else
{
return null; //Wenn 'ugii_base_dir' nicht existiert, dann 'null' zurückgeben
}
}
///
/// Assign values to a NX Version.
///
/// A valid product name. E.g.: NX
/// A valid UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5
/// A valid UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5
/// A valid UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5
/// A valid NX Phase. E.g.: 5 of NX 10.0.3.5
/// A valid Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4
/// A full defined NX Version.
public NxVersion GetNxVersion(string ugiiProductName, int majorVersion, int minorVersion, int subminorVersion, int phase, int mp)
{
NxVersion nxVersion = new NxVersion();
//Wert auflösen und in den Variablen ablegen
AlignCode(ugiiProductName, majorVersion, minorVersion, subminorVersion, phase, mp);
return AssignVersion(); //Werte zuordnen
}
#endregion
#region Compare
///
/// Compares two NX-Versions.
///
/// A valid NX-Version.
/// 0 = equal, 1 = first version newer, 2 = second version newer, -1 = An error is happened.
public int Compare(NxVersion version)
{
return Compare(this, version);
}
///
/// Compares two NX-Versions.
///
/// A valid NX Version.
/// A valid NX Version.
/// 0 = equal, 1 = first version newer, 2 = second version newer, -1 = An error is happened.
public int Compare(NxVersion version1, NxVersion version2)
{
if (version1.NXpatch == version2.NXpatch)
{
return 0; //Versionen gleich
}
if (version1.UgiiMajorVersion < version2.UgiiMajorVersion)
{
return 2; //Version 1 ist älter als Version 2
}
if (version1.UgiiMajorVersion > version2.UgiiMajorVersion)
{
return 1; //Version 1 ist neuer als Version 2
}
if (version1.UgiiMinorVersion < version2.UgiiMinorVersion)
{
return 2; //Version 1 ist älter als Version 2
}
if (version1.UgiiMinorVersion > version2.UgiiMinorVersion)
{
return 1; //Version 1 ist neuer als Version 2
}
if (version1.UgiiSubminorVersion < version2.UgiiSubminorVersion)
{
return 2; //Version 1 ist älter als Version 2
}
if (version1.UgiiSubminorVersion > version2.UgiiSubminorVersion)
{
return 1; //Version 1 ist neuer als Version 2
}
if (version1.NXphase < version2.NXphase)
{
return 2; //Version 1 ist älter als Version 2
}
if (version1.NXphase > version2.NXphase)
{
return 1; //Version 1 ist neuer als Version 2
}
if (version1.MaintenancePackNumber < version2.MaintenancePackNumber)
{
return 2; //Version 1 ist älter als Version 2
}
if (version1.MaintenancePackNumber > version2.MaintenancePackNumber)
{
return 1; //Version 1 ist neuer als Version 2
}
return -1; //Fehler passiert
}
///
/// Compares two NX-Versions.
///
/// A valid product name. E.g.: NX
/// A valid UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5
/// A valid UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5
/// A valid UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5
/// A valid NX Phase. E.g.: 5 of NX 10.0.3.5
/// A valid Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4
/// 0 = equal, 1 = first version newer, 2 = second version newer, -1 = An error is happened.
public int Compare(string ugiiProductName, int majorVersion, int minorVersion, int subminorVersion, int phase, int mp)
{
//NxVersion nxVersion = new NxVersion();
NxVersion nxVersion = GetNxVersion(ugiiProductName, majorVersion, minorVersion, subminorVersion, phase, mp);
//NX-Version vergleichen
return Compare(this, nxVersion);
}
#endregion
#region CommonMethodes
private string ReadProcessOutput(string ugii_base_dir, string arguments)
{
// Liest die Daten nach beenden der Prozess-Ausgabe aus
// Tritt ein Fehler auf, liefert die Funktion null zurück
//Wenn UGII_BASE_DIR mit '\\' endet, dann diese entfernen
if (ugii_base_dir.EndsWith("\\"))
{
ugii_base_dir = ugii_base_dir.Remove(ugii_base_dir.Length - 2);
}
//Überprüfen ob auf alle notwendigen Dateien (env_print.exe, libpatch.dll, libsyss.dll) zugegriffen werden kann
ExecutablesExists(ugii_base_dir);
//Wenn 'ugii_base_dir' existiert, dann die Werte ermitteln}
return ProcessOutput(ugii_base_dir, arguments);
}
private void ExecutablesExists(string ugii_base_dir)
{
//Wenn eine der drei Dateien nicht existiert, dann eine Exception werfen
if (!File.Exists(String.Concat(ugii_base_dir, "\\UGII\\env_print.exe"))) throw new NoEnvPrintExeException("Unable to find EnvPrint.exe");
if (!File.Exists(String.Concat(ugii_base_dir, "\\UGII\\libpatch.dll")) & !File.Exists(String.Concat(ugii_base_dir, "\\NXBIN\\libpatch.dll"))) throw new NoLibPatchDllException("Unable to find LibPatch.dll");
if (!File.Exists(String.Concat(ugii_base_dir, "\\UGII\\libsyss.dll"))) throw new NoLibSysDllException("Unable to find LibSys.dll");
}
private string ProcessOutput(string ugii_base_dir, string arguments)
{
try
{
Process process = new Process();
process.StartInfo.FileName = String.Concat(ugii_base_dir, "\\UGII\\env_print.exe");
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
return process.StandardOutput.ReadToEnd();
}
catch (Exception)
{
return null;
}
}
private void AlignCode(string versionNumber, string tempPatchText)
{
//NX Version zerlegen
string[] versionSegments = new string[6] ;
string[] temp = new string[5];
temp = SeperateVersionCode(versionNumber);
for (int i = 0; i < 5; i++)
{
versionSegments[i] = temp[i];
}
//versionSegments = SeperateVersionCode(versionNumber);
//Patch Text zerlegen
versionSegments[5] = SeperatePatchText(tempPatchText);
//TODO:
//Werte zuordnen
NXpatch = String.Concat(versionSegments[0], " ", versionSegments[1], ".", versionSegments[2], ".", versionSegments[3], ".", versionSegments[4], " ", versionSegments[5]); //NX Patch
NXversion = String.Concat(versionSegments[0], " ", versionSegments[1], ".", versionSegments[2], ".", versionSegments[3], ".", versionSegments[4]); //NX Version
MaintenanceRelease = String.Concat(versionSegments[1], ".", versionSegments[2], ".", versionSegments[3], ".", versionSegments[4]); //Maintenance Release
UgiiProductName = versionSegments[0]; //Produkt Name
UgiiMajorVersion = Convert.ToInt32(versionSegments[1]); //Major Version
UgiiMinorVersion = Convert.ToInt32(versionSegments[2]); //Minor Version
UgiiSubminorVersion = Convert.ToInt32(versionSegments[3]); //Subminor Version
NXphase = Convert.ToInt32(versionSegments[4]); //NX Phase
MaintenancePack = versionSegments[5]; //Maintenance Pack
MaintenancePackNumber = Convert.ToInt32(versionSegments[5].Replace("MP", ""));
NxVersionString = String.Concat("V", (Convert.ToInt32(versionSegments[1]) + 18).ToString(), ".", versionSegments[2], ".", versionSegments[3], ".", versionSegments[4]); //NX Version String
NxMajorVersionString = String.Concat("V", (Convert.ToInt32(versionSegments[1]) + 18).ToString()); //Major Version String
NxMinorVersionString = versionSegments[2].ToString(); //Minor Version String
NxSubminorVersionString = versionSegments[3].ToString(); //Subminor Version String
NxPhaseString = versionSegments[4].ToString(); //NX Phase String
UgiiFullVersion = String.Concat("v", versionSegments[1], ".", versionSegments[2], ".", versionSegments[3], ".", versionSegments[4]); //NX Full Version
UgiiVersion = String.Concat("v", versionSegments[1]);
}
private void AlignCode(string ugiiProductName, int majorVersion, int minorVersion, int subminorVersion, int phase, int mp)
{
//Werte zuordnen
NXpatch = String.Concat(ugiiProductName, " ", majorVersion, ".", minorVersion, ".", subminorVersion, ".", phase, " MP", mp); //NX Patch
NXversion = String.Concat(ugiiProductName, " ", majorVersion, ".", minorVersion, ".", subminorVersion, ".", phase); //NX Version
MaintenanceRelease = String.Concat(majorVersion, ".", minorVersion, ".", subminorVersion, ".", phase); //Maintenance Release
UgiiProductName = ugiiProductName; //Produkt Name
UgiiMajorVersion = majorVersion; //Major Version
UgiiMinorVersion = minorVersion; //Minor Version
UgiiSubminorVersion = subminorVersion; //Subminor Version
NXphase = phase; //NX Phase
MaintenancePack = String.Concat("MP", mp); //Maintenance Pack
MaintenancePackNumber = mp;
NxVersionString = String.Concat("V", (Convert.ToInt32(majorVersion) + 18).ToString(), ".", minorVersion, ".", subminorVersion, ".", phase); //NX Version String
NxMajorVersionString = String.Concat("V", (Convert.ToInt32(majorVersion) + 18).ToString()); //Major Version String
NxMinorVersionString = minorVersion.ToString(); //Minor Version String
NxSubminorVersionString = subminorVersion.ToString(); //Subminor Version String
NxPhaseString = phase.ToString(); //NX Phase String
UgiiFullVersion = String.Concat("v", majorVersion, ".", minorVersion, ".", subminorVersion, ".", phase); //NX Full Version
UgiiVersion = String.Concat("v", majorVersion);
}
private NxVersion AssignVersion()
{
NxVersion nxVersion = new NxVersion();
nxVersion.NXpatch = NXpatch; //NX Patch. E.g.: NX 10.0.3.5 MP4
nxVersion.NXversion = NXversion; //NX Version. E.g.: NX 10.0.3.5
nxVersion.MaintenanceRelease = MaintenanceRelease; //Maintenance Release. E.g.: 10.0.3.5 of NX 10.0.3.5 MP4
nxVersion.UgiiProductName = UgiiProductName; //UGII_PRODUCT_NAME. E.g.: NX of NX 10.0.3.5
nxVersion.UgiiMajorVersion = UgiiMajorVersion; //UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5
nxVersion.UgiiMinorVersion = UgiiMinorVersion; //UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5
nxVersion.UgiiSubminorVersion = UgiiSubminorVersion; //UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5
nxVersion.NXphase = NXphase; //NX Phase. E.g.: 5 of NX 10.0.3.
nxVersion.MaintenancePack = MaintenancePack; //Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4
nxVersion.MaintenancePackNumber = MaintenancePackNumber; //Maintenance Pack Number. E.g.: 4 of NX 10.0.3.5 MP4
nxVersion.NxVersionString = NxVersionString; //NX_VERSION_STRING. E.g.: V28.0.3.5 instead of NX 10.0.3.5 MP4
nxVersion.NxMajorVersionString = NxMajorVersionString; //NX_MAJOR_STRING. E.g.: V28 of V28.0.3.5
nxVersion.NxMinorVersionString = NxMinorVersionString; //NX_MINOR_STRING. E.g.: 0 of V28.0.3.5
nxVersion.NxSubminorVersionString = NxSubminorVersionString; //NX_SUBMINOR_STRING. E.g.: 3 of V28.0.3.5
nxVersion.NxPhaseString = NxPhaseString; //NX_PHASE_STRING. E.g.: 5 of V28.0.3.5
nxVersion.UgiiFullVersion = UgiiFullVersion; //UGII_FULL_VERSION. E.g.: v10.0.3.5 instead of NX 10.0.3.5
nxVersion.UgiiVersion = UgiiVersion; //UGII_VERSION. E.g.: v10 of v10.0.3.5
return nxVersion;
}
private string[] SeperateVersionCode(string versionNumber)
{
//Wert auflösen und in den Variablen ablegen
if (versionNumber == "\n\r" || versionNumber == null)
{
versionNumber = "NX 00.0.0.00"; //Wenn kein Wert zurückgeliefert wird, dann mit Null vorbelegen
}
if (versionNumber.EndsWith("\r\n"))
{
versionNumber = versionNumber.Replace("\r\n", ""); //Zeilenvorschub und Wagenrücklauf entfernen
}
else if (versionNumber.EndsWith("\n\r"))
{
versionNumber = versionNumber.Replace("\n\r", ""); //Zeilenvorschub und Wagenrücklauf entfernen
}
string[] versionSegments = new string[5];
versionSegments[0] = versionNumber.Remove(versionNumber.IndexOf(" ")); //Produktnamen zuordnen. Z.B.: NX of NX 10.0.3.5
versionNumber = versionNumber.Remove(0, versionNumber.IndexOf(" ") + 1); //Den Produktnamen entfernen
//Die einzelnen Segmente herauslösen
string[] tempVersionSegments = versionNumber.Split(new Char[] { '.' });
if (tempVersionSegments.Length != 4)
{
if (tempVersionSegments.Length == 3)
{
//NX Phase fehlt
versionSegments[1] = tempVersionSegments[0];
versionSegments[2] = tempVersionSegments[1];
versionSegments[3] = tempVersionSegments[2];
versionSegments[4] = "0";
}
else if (tempVersionSegments.Length == 2)
{
//Sub Minor Version und NX Phase fehlen
versionSegments[1] = tempVersionSegments[0];
versionSegments[2] = tempVersionSegments[1];
versionSegments[3] = "0";
versionSegments[4] = "0";
}
else if (tempVersionSegments.Length == 1)
{
//Minor Version, Sub Minor Version und NX Phase fehlen
versionSegments[1] = tempVersionSegments[0];
versionSegments[2] = "0";
versionSegments[3] = "0";
versionSegments[4] = "0";
}
else
{
//Major Version, Minor Version, Sub Minor Version und NX Phase fehlen
versionSegments[1] = "0";
versionSegments[2] = "0";
versionSegments[3] = "0";
versionSegments[4] = "0";
}
}
else
{
versionSegments[1] = tempVersionSegments[0];
versionSegments[2] = tempVersionSegments[1];
versionSegments[3] = tempVersionSegments[2];
versionSegments[4] = tempVersionSegments[3];
}
return versionSegments;
}
private string SeperatePatchText(string patchText)
{
if (patchText.Contains("MP"))
{
patchText = patchText.Remove(patchText.IndexOf(",")); //Alles nach dem Beistrich
patchText = patchText.Remove(0, patchText.IndexOf("MP")); //Alles vor MP abschneiden
return patchText;
}
else
{
return "MP0"; //Es wurde kein gültiger Text gefunden, darum einen Wert zuweisen
}
}
private NxVersion AssignVersionSegments(string[] versionSegments)
{
NxVersion nxVersion = new NxVersion();
// NX_VERSION. E.g.: NX 10.0.3.5
nxVersion.NXversion = versionSegments[0] + " " + versionSegments[1] + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4];
NXversion = nxVersion.NXversion;
// NX_PHASE. E.g.: 5 of NX 10.0.3.5
nxVersion.NXphase = Convert.ToInt16(versionSegments[4]);
NXphase = nxVersion.NXphase;
// NX_PATCH. E.g.: NX 10.0.3.5 MP4
nxVersion.NXpatch = nxVersion.NXversion + " " + versionSegments[5];
NXpatch = nxVersion.NXpatch;
// UGII_PRODUCT_NAME. E.g.: NX of NX 10.0.3.5
nxVersion.UgiiProductName = versionSegments[0];
UgiiProductName = nxVersion.UgiiProductName;
// UGII_VERSION. E.g.: v10 of NX 10.0.3.5
nxVersion.UgiiVersion = "v" + versionSegments[1];
UgiiVersion = nxVersion.UgiiVersion;
// UGII_FULL_VERSION. E.g.: v10.0.3.5
nxVersion.UgiiFullVersion = "v" + versionSegments[1] + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4];
UgiiFullVersion = nxVersion.UgiiFullVersion;
// UGII_MAJOR_VERSION. E.g.: 10 of NX 10.0.3.5
nxVersion.UgiiMajorVersion = Convert.ToInt16(versionSegments[1]);
UgiiMajorVersion = nxVersion.UgiiMajorVersion;
// UGII_MINOR_VERSION. E.g.: 0 of NX 10.0.3.5
nxVersion.UgiiMinorVersion = Convert.ToInt16(versionSegments[2]);
UgiiMinorVersion = nxVersion.UgiiMinorVersion;
// UGII_SUBMINOR_VERSION. E.g.: 3 of NX 10.0.3.5
nxVersion.UgiiSubminorVersion = Convert.ToInt16(versionSegments[3]);
UgiiSubminorVersion = nxVersion.UgiiSubminorVersion;
// NX_VERSION_STRING. E.g.: V28.0.3.5 instead of NX 10.0.3.5 MP4
nxVersion.NxVersionString = "V" + (Convert.ToInt16(versionSegments[1]) + 18).ToString() + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4];
NxVersionString = nxVersion.NxVersionString;
// NX_MAJOR_STRING. E.g.: V28 of V28.0.3.5
nxVersion.NxMajorVersionString = "V" + (Convert.ToInt16(versionSegments[1]) + 18).ToString();
NxMajorVersionString = nxVersion.NxMajorVersionString;
// NX_MINOR_STRING. E.g.: 0 of V28.0.3.5
nxVersion.NxMinorVersionString = versionSegments[2];
NxMinorVersionString = nxVersion.NxMinorVersionString;
// NX_SUBMINOR_STRING. E.g.: 3 of V28.0.3.5
nxVersion.NxSubminorVersionString = versionSegments[3];
NxSubminorVersionString = nxVersion.NxSubminorVersionString;
// NX_PHASE_STRING. E.g.: 5 of V28.0.3.5
nxVersion.NxPhaseString = versionSegments[4];
NxPhaseString = nxVersion.NxPhaseString;
// Maintenance Release. E.g.: 10.0.3.5 of NX 10.0.3.5 MP4
nxVersion.MaintenanceRelease = versionSegments[1] + "." + versionSegments[2] + "." + versionSegments[3] + "." + versionSegments[4];
MaintenanceRelease = nxVersion.MaintenanceRelease;
// Maintenance Pack. E.g.: MP4 of NX 10.0.3.5 MP4
nxVersion.MaintenancePack = versionSegments[5];
MaintenancePack = nxVersion.MaintenancePack;
// Maintenance Pack Number. E.g.: 4 of NX 10.0.3.5 MP4
nxVersion.MaintenancePackNumber = Convert.ToInt16(nxVersion.MaintenancePack.Remove(0, nxVersion.MaintenancePack.IndexOf("MP") + 2));
MaintenancePackNumber = nxVersion.MaintenancePackNumber;
return nxVersion;
}
///
/// Converts a NxPatch string to NxVersion
///
/// A valid NxPatch. E.g.: NX 10.0.3.5 MP4
///
public NxVersion ConvertStringPatchToNxVersionPatch(string nxPatch)
{
return AssignVersionSegments(SeperateVersionCode(nxPatch));
}
#endregion
}
#region Exception
class NoNXversionException : ApplicationException
{
public NoNXversionException()
{ }
public NoNXversionException(string message) : base(message)
{ }
public NoNXversionException(string message, Exception inner) : base(message, inner)
{ }
}
class NoEnvPrintExeException : ApplicationException
{
public NoEnvPrintExeException()
{ }
public NoEnvPrintExeException(string message) : base(message)
{ }
public NoEnvPrintExeException(string message, Exception inner) : base(message, inner)
{ }
}
class NoLibPatchDllException : ApplicationException
{
public NoLibPatchDllException()
{ }
public NoLibPatchDllException(string message) : base(message)
{ }
public NoLibPatchDllException(string message, Exception inner) : base(message, inner)
{ }
}
class NoLibSysDllException : ApplicationException
{
public NoLibSysDllException()
{ }
public NoLibSysDllException(string message) : base(message)
{ }
public NoLibSysDllException(string message, Exception inner) : base(message, inner)
{ }
}
#endregion
}