using Aml.Engine.AmlObjects;
using Aml.Engine.CAEX;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Packaging;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
namespace Aml.Editor.Plugin
{
public class MWData : DeviceDescription
{
// holds the controller to report created devices to
private readonly MWController mWController;
///
/// Create the MWData Object
///
/// the MWController to report to
public MWData(MWController mWController)
{
this.mWController = mWController;
}
///
/// Read the all attributes in and write the values into
///
/// the object to write the data into
/// the list of attributes
///
/// Read the all attributes in and write the values into
///
/// the object to write the data into
/// the list of attributes
private void fillDeviceWithData(MWDevice device, AttributeSequence attributes)
{
// iterate over all atttributes
/*foreach (AttributeType attribute in attributes)
{
// apply the value of the attribute to the correct interface parameter
switch (attribute.Name)
{
}
}*/
}
///
/// Create the AMLX File with the correct AML File and optional pictures
///
/// The device which will be created
/// true if an amlx file get update, false if a new file will be created
///
public string CreateDevice(MWDevice device, bool isEdit, bool useCaex2_15)
{
CAEXDocument document;
AutomationMLContainer amlx = null;
// Init final .amlx Filepath
string amlFilePath;
string fileName = device.fileName;
amlFilePath = fileName.Contains(".amlx") ? Path.Combine(device.filepath, fileName) : Path.Combine(device.filepath, fileName + ".amlx");
FileInfo file = new FileInfo(amlFilePath);
// Create directory if it's not existing
file.Directory.Create();
// Init CAEX Document
if (isEdit)
{
// Load the amlx file
amlx = new AutomationMLContainer(amlFilePath, FileMode.OpenOrCreate);
IEnumerable rootParts = amlx.GetPartsByRelationShipType(AutomationMLContainer.RelationshipType.Root);
// We expect the aml to only have one root part
if (rootParts.First() != null)
{
PackagePart part = rootParts.First();
// load the aml file as an CAEX document
document = CAEXDocument.LoadFromStream(part.GetStream());
}
else
{
// the amlx contains no aml file
if (useCaex2_15) document = CAEXDocument.New_CAEXDocument(CAEXDocument.CAEXSchema.CAEX2_15);
else document = CAEXDocument.New_CAEXDocument(CAEXDocument.CAEXSchema.CAEX3_0);
}
}
else
{
// create a new CAEX document
if (useCaex2_15) document = CAEXDocument.New_CAEXDocument(CAEXDocument.CAEXSchema.CAEX2_15);
else document = CAEXDocument.New_CAEXDocument(CAEXDocument.CAEXSchema.CAEX3_0);
try
{
amlx = new AutomationMLContainer(amlFilePath, FileMode.OpenOrCreate);
}
catch (Exception)
{
Console.WriteLine("Failed to create AutomationMLContainer object");
}
}
// Init the default Libs
AutomationMLBaseRoleClassLibType.RoleClassLib(document);
AutomationMLInterfaceClassLibType.InterfaceClassLib(document);
var structureRoleFamilyType = AutomationMLBaseRoleClassLibType.RoleClassLib(document).Structure;
SystemUnitFamilyType systemUnitClass = null;
// Create the SystemUnitClass for our device
if (!isEdit)
{
systemUnitClass = document.CAEXFile.SystemUnitClassLib.Append("ComponentSystemUnitClassLib").SystemUnitClass.Append(device.deviceName);
device.listWithURIConvertedToString = new List();
foreach (AttachablesDataGridViewParameters eachparameter in device.dataGridAttachablesParametrsList)
{
if (eachparameter.FilePath.Contains("https://") || eachparameter.FilePath.Contains("http://") || eachparameter.FilePath.Contains("www") || eachparameter.FilePath.Contains("WWW"))
{
interneturl(eachparameter.FilePath, eachparameter.ElementName.ToString(), "ExternalDataConnector", systemUnitClass);
}
else
{
Boolean myBool;
Boolean.TryParse(eachparameter.AddToFile, out myBool);
Uri eachUri = null;
AttachablesDataGridViewParameters par = new AttachablesDataGridViewParameters();
eachUri = createPictureRef(eachparameter.FilePath, eachparameter.ElementName.ToString(), "ExternalDataConnector", systemUnitClass);
par.ElementName = eachUri.ToString();
par.FilePath = eachparameter.FilePath;
device.listWithURIConvertedToString.Add(par);
}
}
foreach (var pair in device.DictionaryForRoleClassofComponent)
{
Match numberfromElectricalConnectorType = Regex.Match(pair.Key.ToString(), @"\((\d+)\)");
string initialnumberbetweenparanthesisofElectricalConnectorType =
numberfromElectricalConnectorType.Groups[1].Value;
// string stringinparanthesis = Regex.Match(pair.Key.ToString(), @"\{(\d+)\}").Groups[1].Value;
string supportedRoleClassFromDictionary = Regex.Replace(pair.Key.ToString(), @"\(.+?\)", "");
supportedRoleClassFromDictionary = Regex.Replace(supportedRoleClassFromDictionary, @"\{.+?\}", "");
var SRC = systemUnitClass.SupportedRoleClass.Append();
var attributesOfSystemUnitClass = systemUnitClass.Attribute;
foreach (var valueList in pair.Value)
{
foreach (var item in valueList)
{
if (item.AttributePath.Contains("/") || item.AttributePath.Contains("."))
{
int count = 2;
int counter = 0;
Stack stack = new Stack();
string searchAttributeName =
item.AttributePath.Substring(0, item.AttributePath.Length - item.Name.Length);
foreach (var character in searchAttributeName.Reverse())
{
if (!char.IsLetterOrDigit(character))
{
counter++;
if (counter == count)
{
break;
}
}
if (char.IsLetterOrDigit(character))
{
stack.Push(character);
}
}
string finalAttributeName = new string(stack.ToArray());
foreach (var attribute in systemUnitClass.Attribute)
{
if (attribute.Name == finalAttributeName)
{
var eachattribute = attribute.Attribute.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
SRC.RefRoleClassPath = item.SupportesRoleClassType;
}
if (attribute.Attribute.Exists)
{
SearchForAttributesInsideAttributesofAutomationComponent(finalAttributeName,
attribute, item, SRC);
}
}
}
else
{
var eachattribute = attributesOfSystemUnitClass.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
SRC.RefRoleClassPath = item.SupportesRoleClassType;
}
}
}
foreach (var pairofList in device.DictionaryForExternalInterfacesUnderRoleClassofComponent)
{
Match numberfromElectricalConnectorPins = Regex.Match(pairofList.Key.ToString(), @"\((\d+)\)");
string initialnumberbetweenparanthesisElectricalConnectorPins =
numberfromElectricalConnectorPins.Groups[1].Value;
string electricalConnectorPinName = Regex.Replace(pairofList.Key.ToString(), @"\(.*?\)", "");
electricalConnectorPinName = Regex.Replace(electricalConnectorPinName, @"\{.*?\}", "");
electricalConnectorPinName =
electricalConnectorPinName.Replace(supportedRoleClassFromDictionary, "");
}
}
}
else
{
// check if our format is given in the amlx file if not: create it
bool foundSysClassLib = false;
foreach (var sysclasslib in document.CAEXFile.SystemUnitClassLib)
{
if (sysclasslib.Name.Equals("ComponentSystemUnitClassLib"))
{
bool foundSysClass = false;
foreach (var sysclass in sysclasslib.SystemUnitClass)
{
if (sysclass.Name.Equals(device.deviceName))
{
foundSysClass = true;
systemUnitClass = sysclass;
break;
}
}
if (!foundSysClass)
systemUnitClass = sysclasslib.SystemUnitClass.Append(device.deviceName);
foundSysClassLib = true;
}
}
if (!foundSysClassLib) systemUnitClass = document.CAEXFile.SystemUnitClassLib.Append("ComponentSystemUnitClassLib").SystemUnitClass.Append(device.deviceName);
}
// Create the internalElement Interfaces
if (device.vendorName != null)
{
InternalElementType electricalInterface = null;
RoleRequirementsType roleRequirements = null;
foreach (var internalElement in systemUnitClass.InternalElement)
{
if (internalElement.Name.Equals("Interfaces"))
{
electricalInterface = internalElement;
roleRequirements = electricalInterface.RoleRequirements.Append();
roleRequirements.RefBaseRoleClassPath = structureRoleFamilyType.CAEXPath();
break;
}
}
if (electricalInterface == null)
electricalInterface = systemUnitClass.InternalElement.Append("Interfaces");
roleRequirements = electricalInterface.RoleRequirements.Append();
roleRequirements.RefBaseRoleClassPath = structureRoleFamilyType.CAEXPath();
foreach (var pair in device.DictionaryForInterfaceClassesInElectricalInterfaces)
{
InternalElementType internalElementofElectricalConnectorType = null;
ExternalInterfaceType electricalConnectorType = null;
ExternalInterfaceType electricalConnectorPins = null;
Match numberfromElectricalConnectorType = Regex.Match(pair.Key.ToString(), @"\((\d+)\)");
string initialnumberbetweenparanthesisofElectricalConnectorType = numberfromElectricalConnectorType.Groups[1].Value;
string electricalConnectorTypeName = Regex.Replace(pair.Key.ToString(), @"\(.+?\)", "");
electricalConnectorTypeName = Regex.Replace(electricalConnectorTypeName, @"\{.+?\}", "");
internalElementofElectricalConnectorType = electricalInterface.InternalElement.Append(electricalConnectorTypeName);
electricalConnectorType = internalElementofElectricalConnectorType.ExternalInterface.Append(electricalConnectorTypeName);
var attributesOfConnectorType = electricalConnectorType.Attribute;
foreach (var valueList in pair.Value)
{
foreach (var item in valueList)
{
if (item.AttributePath.Contains("/") || item.AttributePath.Contains("."))
{
int count = 2;
int counter = 0;
Stack stack = new Stack();
string searchAttributeName = item.AttributePath.Substring(0, item.AttributePath.Length - item.Name.Length);
foreach (var character in searchAttributeName.Reverse())
{
if (!char.IsLetterOrDigit(character))
{
counter++;
if (counter == count)
{
break;
}
}
if (char.IsLetterOrDigit(character))
{
stack.Push(character);
}
}
string finalAttributeName = new string(stack.ToArray());
foreach (var attribute in electricalConnectorType.Attribute)
{
if (attribute.Name == finalAttributeName)
{
var eachattribute = attribute.Attribute.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
electricalConnectorType.RefBaseClassPath = item.RefBaseClassPath;
}
if (attribute.Attribute.Exists)
{
SearchAttributesInsideAttributesOFElectricConnectorType(finalAttributeName, attribute, item, electricalConnectorType);
}
}
}
else
{
var eachattribute = attributesOfConnectorType.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
electricalConnectorType.RefBaseClassPath = item.RefBaseClassPath;
}
}
}
foreach (var pairofList in device.DictionaryForExternalInterfacesUnderInterfaceClassInElectricalInterfaces)
{
Match numberfromElectricalConnectorPins = Regex.Match(pairofList.Key.ToString(), @"\((\d+)\)");
string initialnumberbetweenparanthesisElectricalConnectorPins = numberfromElectricalConnectorPins.Groups[1].Value;
string electricalConnectorPinName = Regex.Replace(pairofList.Key.ToString(), @"\(.*?\)", "");
electricalConnectorPinName = Regex.Replace(electricalConnectorPinName, @"\{.*?\}", "");
electricalConnectorPinName = electricalConnectorPinName.Replace(electricalConnectorTypeName, "");
if (initialnumberbetweenparanthesisofElectricalConnectorType == initialnumberbetweenparanthesisElectricalConnectorPins)
{
electricalConnectorPins = electricalConnectorType.ExternalInterface.Append(electricalConnectorPinName);
var attributesOfConnectorPins = electricalConnectorPins.Attribute;
foreach (var valueList in pairofList.Value)
{
foreach (var item in valueList)
{
if (item.AttributePath.Contains("/") || item.AttributePath.Contains("."))
{
int count = 2;
int counter = 0;
Stack stack = new Stack();
string searchAttributeName = item.AttributePath.Substring(0, item.AttributePath.Length - item.Name.Length);
foreach (var character in searchAttributeName.Reverse())
{
if (!char.IsLetterOrDigit(character))
{
counter++;
if (counter == count)
{
break;
}
}
if (char.IsLetterOrDigit(character))
{
stack.Push(character);
}
}
string finalAttributeName = new string(stack.ToArray());
foreach (var attribute in electricalConnectorPins.Attribute)
{
if (attribute.Name == finalAttributeName)
{
var eachattribute = attribute.Attribute.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
electricalConnectorPins.RefBaseClassPath = item.RefBaseClassPath;
}
if (attribute.Attribute.Exists)
{
SearchAttributesInsideAttributesOFElectricConnectorType(finalAttributeName, attribute, item, electricalConnectorPins);
}
}
}
else
{
var eachattribute = attributesOfConnectorPins.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
electricalConnectorPins.RefBaseClassPath = item.RefBaseClassPath;
}
}
}
}
}
}
}
string[] splitName = fileName.Split('\\');
string newFileName = splitName[splitName.Length - 1];
// create the PackageUri for the root aml file
Uri partUri = PackUriHelper.CreatePartUri(new Uri("/" + newFileName + "-root.aml", UriKind.Relative));
// create the aml file as a temporary file
string path = Path.GetTempFileName();
document.SaveToFile(path, true);
if (isEdit)
{
// delete the old aml file
amlx.Package.DeletePart(partUri);
// delete all files in the amlx package.
// Directory.Delete(Path.GetFullPath(amlx.ContainerFilename), true);
}
// write the new aml file into the package
PackagePart root = amlx.AddRoot(path, partUri);
if (!isEdit)
{
foreach (AttachablesDataGridViewParameters listWithUri in device.listWithURIConvertedToString)
{
if (listWithUri.ElementName != null)
{
Uri newuri = null;
newuri = new Uri(listWithUri.ElementName, UriKind.Relative);
amlx.AddAnyContent(root, listWithUri.FilePath.ToString(), newuri);
}
}
}
DirectoryInfo directory = new DirectoryInfo(Path.GetDirectoryName(amlFilePath));
foreach (FileInfo fileInfos in directory.GetFiles())
{
if (fileInfos.Extension != ".amlx")
{
fileInfos.Delete();
}
}
amlx.Save();
amlx.Close();
return isEdit ? "Sucessfully updated device!\nFilepath " + amlFilePath : "Device description file created!\nFilepath " + amlFilePath;
}
public void SearchForAttributesInsideAttributesofAutomationComponent(string searchName, AttributeType attribute, ClassOfListsFromReferencefile item, SupportedRoleClassType SRC)
{
foreach (var nestedAttribute in attribute.Attribute)
{
if (nestedAttribute.Name == searchName)
{
var eachattribute = nestedAttribute.Attribute.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
SRC.RefRoleClassPath = item.SupportesRoleClassType;
}
if (nestedAttribute.Attribute.Exists)
{
SearchForAttributesInsideAttributesofAutomationComponent(searchName, nestedAttribute, item, SRC);
}
}
}
public void SearchAttributesInsideAttributesOFElectricConnectorType(string searchName, AttributeType attribute, ClassOfListsFromReferencefile item, ExternalInterfaceType electricConnectorType)
{
foreach (var nestedAttribute in attribute.Attribute)
{
if (nestedAttribute.Name == searchName)
{
var eachattribute = nestedAttribute.Attribute.Append(item.Name.ToString());
eachattribute.Value = item.Value;
eachattribute.DefaultValue = item.Default;
eachattribute.Unit = item.Unit;
eachattribute.AttributeDataType = item.DataType;
eachattribute.Description = item.Description;
eachattribute.Copyright = item.CopyRight;
eachattribute.ID = item.ID;
foreach (var val in item.RefSemanticList.Elements)
{
var refsem = eachattribute.RefSemantic.Append();
refsem.CorrespondingAttributePath = val.FirstAttribute.Value;
}
electricConnectorType.RefBaseClassPath = item.RefBaseClassPath;
}
if (nestedAttribute.Attribute.Exists)
{
SearchAttributesInsideAttributesOFElectricConnectorType(searchName, nestedAttribute, item, electricConnectorType);
}
}
}
///
/// Takes the url of the picture and setup in the value attribute of the corresponding internal element .
///
/// the absolut path to the picture or document in the internet
/// Picturetyp like 'DevicePicture' or 'DeviceIcon' and document type like "Short guide" or "Bill of materials" etc
/// The name of the externalElement
/// the systemUnitClass to insert the structure into
///
public void interneturl(string url, string urltype, string externalname, SystemUnitClassType systemUnitClass)
{
// Create the InternalElement which refers to the picture
InternalElementType urlIE = null;
foreach (var internalElement in systemUnitClass.InternalElement)
{
if (internalElement.Name.Equals(urltype))
{
urlIE = internalElement;
break;
}
}
if (urlIE == null)
urlIE = systemUnitClass.InternalElement.Append(urltype);
// create the externalelement
ExternalInterfaceType urlEI = null;
foreach (var externalinterface in urlIE.ExternalInterface)
{
if (externalinterface.Name.Equals(externalname))
{
urlEI = externalinterface;
break;
}
}
if (urlEI == null)
urlEI = urlIE.ExternalInterface.Append(externalname);
urlEI.RefBaseClassPath = AutomationMLInterfaceClassLib.ExternalDataConnector;
// create the refURI Attribute with the value of the path
AttributeType urlAtt = null;
if (urlEI.Attribute.GetCAEXAttribute("refURI") == null)
{
urlAtt = urlEI.Attribute.Append("refURI");
}
urlAtt.AttributeDataType = "xs:anyURI";
urlAtt.Value = url.ToString();
}
///
/// Creates the Structur to reference a picture and set the correct value .
/// If the structur is already there, it will only update the value.
///
/// the absolut path to the picture
/// Picturetyp like 'DevicePicture' or 'DeviceIcon'
/// The name of the externalElement
/// the systemUnitClass to insert the structure into
///
public Uri createPictureRef(string pic, string pictype, string externalname, SystemUnitClassType systemUnitClass)
{
// create the package paths
FileInfo pictureInfo = new FileInfo(pic);
Uri picturePath = new Uri(pictureInfo.Name, UriKind.Relative);
Uri picturePart = PackUriHelper.CreatePartUri(picturePath);
// Create the InternalElement which refers to the picture
InternalElementType pictureIE = null;
foreach (var internalElement in systemUnitClass.InternalElement)
{
if (internalElement.Name.Equals(pictype))
{
pictureIE = internalElement;
break;
}
}
if (pictureIE == null)
pictureIE = systemUnitClass.InternalElement.Append(pictype);
// create the externalelement
ExternalInterfaceType pictureEI = null;
foreach (var externalinterface in pictureIE.ExternalInterface)
{
if (externalinterface.Name.Equals(externalname))
{
pictureEI = externalinterface;
break;
}
}
if (pictureEI == null)
pictureEI = pictureIE.ExternalInterface.Append(externalname);
pictureEI.RefBaseClassPath = AutomationMLInterfaceClassLib.ExternalDataConnector;
// create the refURI Attribute with the value of the path
AttributeType pictureAtt = null;
if (pictureEI.Attribute.GetCAEXAttribute("refURI") == null)
{
pictureAtt = pictureEI.Attribute.Append("refURI");
}
pictureAtt.AttributeDataType = "xs:anyURI";
pictureAtt.Value = picturePart.ToString();
return picturePart;
}
///
/// Creates the Structur to reference a document and set the correct value .
/// If the structur is already there, it will only update the value.
///
/// the absolut path to the document
/// Documenttype like 'Short Guide' or 'Bill of Materials'
/// The name of the externalElement
/// the systemUnitClass to insert the structure into
///
public Uri createDocumentRef(string doc, string doctype, string externalname, SystemUnitClassType systemUnitClass)
{
// create the package paths
FileInfo documentInfo = new FileInfo(doc);
Uri documentPath = new Uri(documentInfo.Name, UriKind.Relative);
Uri documentPart = PackUriHelper.CreatePartUri(documentPath);
// Create the InternalElement which refers to the document
InternalElementType documentIE = null;
foreach (var internalElement in systemUnitClass.InternalElement)
{
if (internalElement.Name.Equals(doctype))
{
documentIE = internalElement;
break;
}
}
if (documentIE == null)
documentIE = systemUnitClass.InternalElement.Append(doctype);
// create the externalelement
ExternalInterfaceType documentEI = null;
foreach (var externalinterface in documentIE.ExternalInterface)
{
if (externalinterface.Name.Equals(externalname))
{
documentEI = externalinterface;
break;
}
}
if (documentEI == null)
documentEI = documentIE.ExternalInterface.Append(externalname);
documentEI.RefBaseClassPath = AutomationMLInterfaceClassLib.ExternalDataConnector;
// create the refURI Attribute with the value of the path
AttributeType pictureAtt = null;
if (documentEI.Attribute.GetCAEXAttribute("refURI") == null)
{
pictureAtt = documentEI.Attribute.Append("refURI");
}
pictureAtt.AttributeDataType = "xs:anyURI";
pictureAtt.Value = documentPart.ToString();
return documentPart;
}
///
/// Calls the iodd2aml Converter using
/// the converted iodd will be saved in an amlx
///
/// the path to the iodd file
/// the result message as a string
public string ImportIODD2AML(string filename)
{
// This methode using Reflection to check if the libary is available at runtime
// If it is, then it's calling the Convert Function
// Iodd2AmlConverter.Libary.ConversionHandler.Convert(String ioddFileData, string amlFileName);
// Read file and create one string with the content
FileInfo fileInfo = new FileInfo(filename);
FileStream fs = new FileStream(filename, FileMode.Open);
StreamReader fileReader = new StreamReader(fs);
String fileinput = fileReader.ReadToEnd();
fileReader.Close();
fs.Close();
// Load Libary .dll
Assembly assembly = Assembly.Load(File.ReadAllBytes("Dd2Aml.Lib.dll"));
Type conversionHandler = null;
// Iterate over all Types in the Libary and get the ConversionHandler Type
foreach (Type type in assembly.ExportedTypes)
{
if (type.Name.Equals("ConversionHandler"))
{
conversionHandler = type;
break;
}
}
// Check if Class is available
if (conversionHandler == null)
{
return "Couldn't find the IODD2AML parser libary (AMLRider)";
}
// Check if Methode is available
MethodInfo convertMethode = conversionHandler.GetMethod("Convert");
if (convertMethode == null)
{
return "Couldn't find the correct parse method. Try downgrading your Version of AMLRider";
}
// Call the static Methode
object result = convertMethode.Invoke(null, new object[] { fileinput, Path.GetFileNameWithoutExtension(filename) + ".aml" });
string converted = (string)result;
if (converted == null)
{
System.Windows.Forms.MessageBox.Show("Maybe the file is invalid", "Error while converting the file!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
return "The device was not imported because an error occured during convertion!";
}
return createAMLXFromString(converted, filename);
}
///
/// Calls the gsd2aml Converter using
/// the converted gsdml will be saved in an amlx
///
/// the path to the gsdml file
/// the result message as a string
public string ImportGSD2AML(string filename)
{
// This methode using Reflection to check if the libary is available at runtime
// If it is, then it's calling the Convert Function
// Gsd2Aml.Lib.Converter.Convert(string inputFilepath, bool strictValidation)
Assembly assembly = Assembly.Load(File.ReadAllBytes("Gsd2Aml.Lib.dll"));
Type conversionHandler = null;
// Iterate over all Types in the Libary and get the ConversionHandler Type
foreach (Type type in assembly.ExportedTypes)
{
if (type.Name.Equals("Converter"))
{
conversionHandler = type;
break;
}
}
// Check if the Method is available
MethodInfo convertMethod = conversionHandler.GetMethod("Convert", new[] { typeof(string), typeof(bool) });
if (convertMethod == null)
{
return "Couldn't find the correct parse method. Try downgrading your Version of Gsd2Aml";
}
object result = null;
try
{
// Call the static method
result = convertMethod.Invoke(null, new object[] { filename, false });
}
catch (Exception ex)
{
return "There was an error converting the file!\n" + ex.Message;
}
string converted = (string)result;
if (converted == null)
{
System.Windows.Forms.MessageBox.Show("Maybe the file is invalid", "Error while converting the file!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
return "The device was not imported because an error occured during convertion!";
}
// Convert string to stream for the CAEXDocument
return createAMLXFromString(converted, filename);
}
///
/// Create an AMLX file with the aml file as string input
///
/// the complete aml file as a string
/// the path to the original gsdml/iodd file
/// the result message as a string
private string createAMLXFromString(string caex, string filename)
{
// create the CAEXDocument from byte string
byte[] bytearray = System.Text.Encoding.Unicode.GetBytes(caex);
CAEXDocument document = CAEXDocument.LoadFromBinary(bytearray);
// create the amlx file
string name = Path.GetFileNameWithoutExtension(filename);
AutomationMLContainer amlx;
if (name.Contains(".amlx"))
{
amlx = new AutomationMLContainer(".\\modellingwizard\\" + name, FileMode.Create);
}
else
{
amlx = new AutomationMLContainer(".\\modellingwizard\\" + name + ".amlx", FileMode.Create);
}
// create the aml package path
Uri partUri = PackUriHelper.CreatePartUri(new Uri("/" + name + "-root.aml", UriKind.Relative));
// create a temp aml file
string path = Path.GetTempFileName();
document.SaveToFile(path, true);
// copy the new aml into the package
PackagePart root = amlx.AddRoot(path, partUri);
// copy the original file into the package
Uri gsdURI = new Uri(new FileInfo(filename).Name, UriKind.Relative);
Uri gsdPartURI = PackUriHelper.CreatePartUri(gsdURI);
amlx.AddAnyContent(root, filename, gsdPartURI);
amlx.Save();
amlx.Close();
return "Sucessfully imported device!\nCreated File " + Path.GetFullPath(".\\modellingwizard\\" + name + ".amlx");
}
public enum MWFileType
{
IODD, GSD
}
public class MWObject
{
// Just as an interface
}
public void copyFiles(string sourceFilePath, string destinationFilePath)
{
string sourFile = Path.GetFileName(sourceFilePath);
string destFile = Path.Combine(destinationFilePath, sourFile);
File.Copy(sourceFilePath, destFile, true);
}
}
}