示例#1
0
        public ScadaTransactionActor(IReliableStateManager stateManager, ModelResourcesDesc modelResourceDesc, EnumDescs enumDescs)
        {
            this.baseLogString = $"{this.GetType()} [{this.GetHashCode()}] =>{Environment.NewLine}";

            this.isCurrentGidToPointItemMapInitialized  = false;
            this.isIncomingGidToPointItemMapInitialized = false;
            this.isCurrentAddressToGidMapInitialized    = false;
            this.isIncomingAddressToGidMapInitialized   = false;
            this.isInfoCacheInitialized               = false;
            this.isModelChangesInitialized            = false;
            this.isCommandDescriptionCacheInitialized = false;

            this.stateManager = stateManager;
            this.stateManager.StateManagerChanged += this.OnStateManagerChangedHandler;

            this.modelResourceDesc        = modelResourceDesc;
            this.enumDescs                = enumDescs;
            this.pointItemHelper          = new ScadaModelPointItemHelper();
            this.reliableDictionaryHelper = new ReliableDictionaryHelper();
        }
示例#2
0
        public void ExportToXml(XmlTextWriter xmlWriter, EnumDescs enumDescs)
        {
            StringBuilder sb;

            xmlWriter.WriteStartElement("ResourceDescription");
            xmlWriter.WriteStartElement("id");
            xmlWriter.WriteStartAttribute("gid");
            xmlWriter.WriteValue(String.Format("0x{0:X16}", this.Id));
            xmlWriter.WriteStartAttribute("type");
            xmlWriter.WriteValue(((DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(this.Id)).ToString());
            xmlWriter.WriteEndElement();             // id
            xmlWriter.WriteStartElement("Properties");
            for (int i = 0; i < this.Properties.Count; i++)
            {
                xmlWriter.WriteStartElement("Property");
                xmlWriter.WriteStartAttribute("id");
                xmlWriter.WriteValue(this.Properties[i].Id.ToString());
                xmlWriter.WriteStartAttribute("value");
                switch (Properties[i].Type)
                {
                case PropertyType.Float:
                    xmlWriter.WriteValue(this.Properties[i].AsFloat());
                    break;

                case PropertyType.Bool:
                case PropertyType.Byte:
                case PropertyType.Int32:
                case PropertyType.Int64:
                case PropertyType.TimeSpan:
                case PropertyType.DateTime:
                    if (this.Properties[i].Id == ModelCode.IDOBJ_GID)
                    {
                        xmlWriter.WriteValue(String.Format("0x{0:X16}", this.Properties[i].AsLong()));
                    }
                    else
                    {
                        xmlWriter.WriteValue(this.Properties[i].AsLong());
                    }

                    break;

                case PropertyType.Enum:
                    try
                    {
                        xmlWriter.WriteValue(enumDescs.GetStringFromEnum(this.Properties[i].Id, this.Properties[i].AsEnum()));
                    }
                    catch (Exception)
                    {
                        xmlWriter.WriteValue(this.Properties[i].AsEnum());
                    }

                    break;

                case PropertyType.Reference:
                    xmlWriter.WriteValue(String.Format("0x{0:X16}", this.Properties[i].AsReference()));
                    break;

                case PropertyType.String:
                    if (this.Properties[i].PropertyValue.StringValue == null)
                    {
                        this.Properties[i].PropertyValue.StringValue = String.Empty;
                    }
                    xmlWriter.WriteValue(this.Properties[i].AsString());
                    break;

                case PropertyType.Int64Vector:
                case PropertyType.ReferenceVector:
                    if (this.Properties[i].AsLongs().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < this.Properties[i].AsLongs().Count; j++)
                        {
                            sb.Append(String.Format("0x{0:X16}", this.Properties[i].AsLongs()[j])).Append(", ");
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty long/reference vector");
                    }

                    break;

                case PropertyType.TimeSpanVector:
                    if (this.Properties[i].AsLongs().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < this.Properties[i].AsLongs().Count; j++)
                        {
                            sb.Append(String.Format("0x{0:X16}", this.Properties[i].AsTimeSpans()[j])).Append(", ");
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty long/reference vector");
                    }

                    break;

                case PropertyType.Int32Vector:
                    if (this.Properties[i].AsInts().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < this.Properties[i].AsInts().Count; j++)
                        {
                            sb.Append(String.Format("{0}", this.Properties[i].AsInts()[j])).Append(", ");
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty int vector");
                    }

                    break;

                case PropertyType.DateTimeVector:
                    if (this.Properties[i].AsDateTimes().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < this.Properties[i].AsDateTimes().Count; j++)
                        {
                            sb.Append(String.Format("{0}", this.Properties[i].AsDateTimes()[j])).Append(", ");
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty DateTime vector");
                    }

                    break;

                case PropertyType.BoolVector:
                    if (this.Properties[i].AsBools().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < this.Properties[i].AsBools().Count; j++)
                        {
                            sb.Append(String.Format("{0}", this.Properties[i].AsBools()[j])).Append(", ");
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty int vector");
                    }

                    break;

                case PropertyType.FloatVector:
                    if (this.Properties[i].AsFloats().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < this.Properties[i].AsFloats().Count; j++)
                        {
                            sb.Append(this.Properties[i].AsFloats()[j]).Append(", ");
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty float vector");
                    }

                    break;

                case PropertyType.StringVector:
                    if (this.Properties[i].AsStrings().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < this.Properties[i].AsStrings().Count; j++)
                        {
                            sb.Append(this.Properties[i].AsStrings()[j]).Append(", ");
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty string vector");
                    }

                    break;

                case PropertyType.EnumVector:
                    if (this.Properties[i].AsEnums().Count > 0)
                    {
                        sb = new StringBuilder(100);

                        for (int j = 0; j < this.Properties[i].AsEnums().Count; j++)
                        {
                            try
                            {
                                sb.Append(String.Format("{0}", enumDescs.GetStringFromEnum(this.Properties[i].Id, this.Properties[i].AsEnums()[j]))).Append(", ");
                            }
                            catch (Exception)
                            {
                                sb.Append(String.Format("{0}", this.Properties[i].AsEnums()[j])).Append(", ");
                            }
                        }

                        xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2));
                    }
                    else
                    {
                        xmlWriter.WriteValue("empty enum vector");
                    }

                    break;

                default:
                    throw new Exception("Failed to export Resource Description as XML. Invalid property type.");
                }

                xmlWriter.WriteEndElement();                 // Property
            }

            xmlWriter.WriteEndElement();             // Properties
            xmlWriter.WriteEndElement();             // ResourceDescription
        }
示例#3
0
 public ModelLabsAppForm()
 {
     enumDescs = new EnumDescs();
     InitializeComponent();
     InitGUIElements();
 }
示例#4
0
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                return("wrong value");
            }

            var prop = value as Property;

            switch (prop.Type)
            {
            case PropertyType.Float:
                return(prop.AsFloat());

            case PropertyType.Bool:
            case PropertyType.Byte:
            case PropertyType.Int32:
            case PropertyType.Int64:
            case PropertyType.TimeSpan:
            case PropertyType.DateTime:
                if (prop.Id == ModelCode.IDOBJ)
                {
                    return(String.Format("0x{0:x16}", prop.AsLong()));
                }
                else
                {
                    return(prop.AsLong());
                }

            case PropertyType.Enum:
                try
                {
                    EnumDescs enumDescs = new EnumDescs();
                    return(enumDescs.GetStringFromEnum(prop.Id, prop.AsEnum()));
                }
                catch (Exception)
                {
                    return(prop.AsEnum());
                }

            case PropertyType.Reference:
                return(String.Format("0x{0:x16}", prop.AsReference()));

            case PropertyType.String:
                if (prop.PropertyValue.StringValue == null)
                {
                    prop.PropertyValue.StringValue = String.Empty;
                }
                return(prop.AsString());

            case PropertyType.Int64Vector:
            case PropertyType.ReferenceVector:
                if (prop.AsLongs().Count > 0)
                {
                    var sb = new StringBuilder(100);
                    for (int j = 0; j < prop.AsLongs().Count; j++)
                    {
                        sb.Append(String.Format("0x{0:x16}", prop.AsLongs()[j])).Append(", ");
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty long/reference vector");
                }

            case PropertyType.TimeSpanVector:
                if (prop.AsLongs().Count > 0)
                {
                    var sb = new StringBuilder(100);
                    for (int j = 0; j < prop.AsLongs().Count; j++)
                    {
                        sb.Append(String.Format("0x{0:x16}", prop.AsTimeSpans()[j])).Append(", ");
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty long/reference vector");
                }

            case PropertyType.Int32Vector:
                if (prop.AsInts().Count > 0)
                {
                    var sb = new StringBuilder(100);
                    for (int j = 0; j < prop.AsInts().Count; j++)
                    {
                        sb.Append(String.Format("{0}", prop.AsInts()[j])).Append(", ");
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty int vector");
                }

            case PropertyType.DateTimeVector:
                if (prop.AsDateTimes().Count > 0)
                {
                    var sb = new StringBuilder(100);
                    for (int j = 0; j < prop.AsDateTimes().Count; j++)
                    {
                        sb.Append(String.Format("{0}", prop.AsDateTimes()[j])).Append(", ");
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty DateTime vector");
                }

            case PropertyType.BoolVector:
                if (prop.AsBools().Count > 0)
                {
                    var sb = new StringBuilder(100);
                    for (int j = 0; j < prop.AsBools().Count; j++)
                    {
                        sb.Append(String.Format("{0}", prop.AsBools()[j])).Append(", ");
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty int vector");
                }

            case PropertyType.FloatVector:
                if (prop.AsFloats().Count > 0)
                {
                    var sb = new StringBuilder(100);
                    for (int j = 0; j < prop.AsFloats().Count; j++)
                    {
                        sb.Append(prop.AsFloats()[j]).Append(", ");
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty float vector");
                }

            case PropertyType.StringVector:
                if (prop.AsStrings().Count > 0)
                {
                    var sb = new StringBuilder(100);
                    for (int j = 0; j < prop.AsStrings().Count; j++)
                    {
                        sb.Append(prop.AsStrings()[j]).Append(", ");
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty string vector");
                }

            case PropertyType.EnumVector:
                if (prop.AsEnums().Count > 0)
                {
                    var       sb        = new StringBuilder(100);
                    EnumDescs enumDescs = new EnumDescs();

                    for (int j = 0; j < prop.AsEnums().Count; j++)
                    {
                        try
                        {
                            sb.Append(String.Format("{0}", enumDescs.GetStringFromEnum(prop.Id, prop.AsEnums()[j]))).Append(", ");
                        }
                        catch (Exception)
                        {
                            sb.Append(String.Format("{0}", prop.AsEnums()[j])).Append(", ");
                        }
                    }

                    return(sb.ToString(0, sb.Length - 2));
                }
                else
                {
                    return("empty enum vector");
                }

            default:
                return("wrong value");
            }
        }
示例#5
0
        public void ExportToXml(XmlTextWriter xmlWriter, EnumDescs enumDescs)
        {
            xmlWriter.WriteStartElement("delta");
            xmlWriter.WriteStartAttribute("id");
            xmlWriter.WriteValue(this.Id);
            xmlWriter.WriteStartElement("operations");

            if (this.InsertOperations.Count > 0)
            {
                xmlWriter.WriteStartElement("operation");
                xmlWriter.WriteStartAttribute("type");
                xmlWriter.WriteValue("insert");
                xmlWriter.WriteStartElement("ResourceDescriptions");
                xmlWriter.WriteStartAttribute("count");
                xmlWriter.WriteValue(this.InsertOperations.Count);
                for (int i = 0; i < this.InsertOperations.Count; i++)
                {
                    this.InsertOperations[i].ExportToXml(xmlWriter, enumDescs);
                }

                xmlWriter.WriteEndElement();                 // operation
                xmlWriter.WriteEndElement();                 // ResourceDescriptions
            }

            if (this.UpdateOperations.Count > 0)
            {
                xmlWriter.WriteStartElement("operation");
                xmlWriter.WriteStartAttribute("type");
                xmlWriter.WriteValue("update");
                xmlWriter.WriteStartElement("ResourceDescriptions");
                xmlWriter.WriteStartAttribute("count");
                xmlWriter.WriteValue(this.UpdateOperations.Count);
                for (int i = 0; i < this.UpdateOperations.Count; i++)
                {
                    this.UpdateOperations[i].ExportToXml(xmlWriter, enumDescs);
                }

                xmlWriter.WriteEndElement();                 // operation
                xmlWriter.WriteEndElement();                 // ResourceDescriptions
            }

            if (this.DeleteOperations.Count > 0)
            {
                xmlWriter.WriteStartElement("operation");
                xmlWriter.WriteStartAttribute("type");
                xmlWriter.WriteValue("delete");
                xmlWriter.WriteStartElement("ResourceDescriptions");
                xmlWriter.WriteStartAttribute("count");
                xmlWriter.WriteValue(this.DeleteOperations.Count);
                for (int i = 0; i < this.DeleteOperations.Count; i++)
                {
                    this.DeleteOperations[i].ExportToXml(xmlWriter, enumDescs);
                }

                xmlWriter.WriteEndElement();                 // operation
                xmlWriter.WriteEndElement();                 // ResourceDescriptions
            }

            xmlWriter.WriteEndElement();             // operations
            xmlWriter.WriteEndElement();             // delta
        }
        public void InitializeDiscretePointItem(DiscretePointItem pointItem, List <Property> props, ModelCode type, EnumDescs enumDescs)
        {
            InitializeScadaModelPointItem(pointItem as ScadaModelPointItem, props, type, enumDescs);

            foreach (var item in props)
            {
                switch (item.Id)
                {
                case ModelCode.DISCRETE_CURRENTOPEN:
                    pointItem.CurrentValue = (ushort)((item.AsBool() == true) ? 1 : 0);
                    break;

                case ModelCode.DISCRETE_MAXVALUE:
                    pointItem.MaxValue = (ushort)item.AsInt();
                    break;

                case ModelCode.DISCRETE_MINVALUE:
                    pointItem.MinValue = (ushort)item.AsInt();
                    break;

                case ModelCode.DISCRETE_NORMALVALUE:
                    pointItem.NormalValue = (ushort)item.AsInt();
                    break;

                case ModelCode.DISCRETE_MEASUREMENTTYPE:
                    pointItem.DiscreteType = (DiscreteMeasurementType)(enumDescs.GetEnumValueFromString(ModelCode.ANALOG_SIGNALTYPE, item.AsEnum().ToString()));
                    break;

                default:
                    break;
                }
            }

            pointItem.Initialized = true;
        }
        public void InitializeScadaModelPointItem(ScadaModelPointItem pointItem, List <Property> props, ModelCode type, EnumDescs enumDescs)
        {
            foreach (var item in props)
            {
                switch (item.Id)
                {
                case ModelCode.IDOBJ_GID:
                    pointItem.Gid = item.AsLong();
                    break;

                case ModelCode.IDOBJ_NAME:
                    pointItem.Name = item.AsString();
                    break;

                case ModelCode.MEASUREMENT_ADDRESS:
                    if (ushort.TryParse(item.AsString(), out ushort address))
                    {
                        pointItem.Address = address;
                    }
                    else
                    {
                        string errorMessage = $"{baseLogString} InitializeScadaModelPointItem => Address ('{item.AsString()}') is either not defined or is invalid.";
                        Logger.LogError(errorMessage);
                        throw new ArgumentException(errorMessage);
                    }
                    break;

                case ModelCode.MEASUREMENT_ISINPUT:
                    if (type == ModelCode.ANALOG)
                    {
                        pointItem.RegisterType = (item.AsBool() == true) ? PointType.ANALOG_INPUT : PointType.ANALOG_OUTPUT;
                    }
                    else if (type == ModelCode.DISCRETE)
                    {
                        pointItem.RegisterType = (item.AsBool() == true) ? PointType.DIGITAL_INPUT : PointType.DIGITAL_OUTPUT;
                    }
                    else
                    {
                        string errorMessage = $"{baseLogString} InitializeScadaModelPointItem => ModelCode type is neither ANALOG nor DISCRETE.";
                        Logger.LogError(errorMessage);
                        throw new ArgumentException(errorMessage);
                    }
                    break;

                default:
                    break;
                }
            }
        }
        public void InitializeAnalogPointItem(AnalogPointItem pointItem, List <Property> props, ModelCode type, EnumDescs enumDescs)
        {
            InitializeScadaModelPointItem(pointItem as ScadaModelPointItem, props, type, enumDescs);

            foreach (var item in props)
            {
                switch (item.Id)
                {
                case ModelCode.ANALOG_CURRENTVALUE:
                    pointItem.CurrentEguValue = item.AsFloat();
                    break;

                case ModelCode.ANALOG_MAXVALUE:
                    pointItem.EGU_Max = item.AsFloat();
                    break;

                case ModelCode.ANALOG_MINVALUE:
                    pointItem.EGU_Min = item.AsFloat();
                    break;

                case ModelCode.ANALOG_NORMALVALUE:
                    pointItem.NormalValue = item.AsFloat();
                    break;

                case ModelCode.ANALOG_SCALINGFACTOR:
                    pointItem.ScalingFactor = item.AsFloat();
                    break;

                case ModelCode.ANALOG_DEVIATION:
                    pointItem.Deviation = item.AsFloat();
                    break;

                case ModelCode.ANALOG_SIGNALTYPE:
                    pointItem.AnalogType = (AnalogMeasurementType)(enumDescs.GetEnumValueFromString(ModelCode.ANALOG_SIGNALTYPE, item.AsEnum().ToString()));
                    break;

                default:
                    break;
                }
            }

            if (pointItem.ScalingFactor == 0)
            {
                string warnMessage = $"{baseLogString} InitializeAnalogPointItem => Analog measurement is of type: {pointItem.AnalogType} which is not supported for alarming. Gid: 0x{pointItem.Gid:X16}, Addres: {pointItem.Address}, Name: {pointItem.Name}, RegisterType: {pointItem.RegisterType}, Initialized: {pointItem.Initialized}";
                Logger.LogWarning(warnMessage);

                pointItem.ScalingFactor = 1;
            }

            pointItem.Initialized = true;
        }
        public ScadaModelImporter(IReliableStateManager stateManager, ModelResourcesDesc modelResourceDesc, EnumDescs enumDescs)
        {
            this.baseLogString = $"{this.GetType()} [{this.GetHashCode()}] =>{Environment.NewLine}";

            this.isGidToPointItemMapInitialized = false;
            this.isAddressToGidMapInitialized   = false;
            this.isInfoCacheInitialized         = false;

            this.stateManager = stateManager;
            this.stateManager.StateManagerChanged += this.OnStateManagerChangedHandler;

            this.modelResourceDesc = modelResourceDesc;
            this.enumDescs         = enumDescs;
            this.pointItemHelper   = new ScadaModelPointItemHelper();
        }
示例#10
0
        public string IspisUTextBox(ResourceDescription rd)
        {
            string        tekst = string.Empty;
            StringBuilder sb;

            tekst += "GID: " + String.Format("0x{0:x16}", rd.Id) + "\n";
            tekst += "Type: " + ((DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(rd.Id)).ToString() + "\n";

            tekst += "Properties:\n";
            for (int i = 0; i < rd.Properties.Count; i++)
            {
                tekst += "\tProperty id: ";
                tekst += rd.Properties[i].Id.ToString() + ", ";
                tekst += "value: ";
                switch (rd.Properties[i].Type)
                {
                case PropertyType.Float:
                    tekst += rd.Properties[i].AsFloat() + "\n";
                    break;

                case PropertyType.Bool:
                case PropertyType.Byte:
                case PropertyType.Int32:
                case PropertyType.Int64:
                case PropertyType.TimeSpan:
                case PropertyType.DateTime:
                    if (rd.Properties[i].Id == ModelCode.IDOBJ_GID)
                    {
                        tekst += String.Format("0x{0:x16}", rd.Properties[i].AsLong()) + "\n";
                    }
                    else
                    {
                        tekst += rd.Properties[i].AsLong() + "\n";
                    }
                    break;

                case PropertyType.Enum:
                    try
                    {
                        EnumDescs enumDescs = new EnumDescs();
                        tekst += enumDescs.GetStringFromEnum(rd.Properties[i].Id, rd.Properties[i].AsEnum()) + "\n";
                    }
                    catch (Exception)
                    {
                        tekst += rd.Properties[i].AsEnum() + "\n";
                    }
                    break;

                case PropertyType.Reference:
                    tekst += String.Format("0x{0:x16}", rd.Properties[i].AsReference()) + "\n";
                    break;

                case PropertyType.String:
                    if (rd.Properties[i].PropertyValue.StringValue == null)
                    {
                        rd.Properties[i].PropertyValue.StringValue = String.Empty;
                    }
                    tekst += rd.Properties[i].AsString() + "\n";
                    break;

                case PropertyType.Int64Vector:
                case PropertyType.ReferenceVector:
                    if (rd.Properties[i].AsLongs().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < rd.Properties[i].AsLongs().Count; j++)
                        {
                            sb.Append(String.Format("0x{0:x16}", rd.Properties[i].AsLongs()[j])).Append(", ");
                        }

                        tekst += sb.ToString(0, sb.Length - 2) + "\n";
                    }
                    else
                    {
                        tekst += "Empty reference vector" + "\n";
                    }
                    break;

                case PropertyType.TimeSpanVector:
                case PropertyType.Int32Vector:
                case PropertyType.DateTimeVector:
                case PropertyType.BoolVector:
                    if (rd.Properties[i].AsBools().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < rd.Properties[i].AsBools().Count; j++)
                        {
                            sb.Append(String.Format("{0}", rd.Properties[i].AsBools()[j])).Append(", ");
                        }
                        tekst += sb.ToString(0, sb.Length - 2) + "\n";
                    }
                    else
                    {
                        tekst += "Empty int vector" + "\n";
                    }
                    break;

                case PropertyType.FloatVector:
                    if (rd.Properties[i].AsFloats().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < rd.Properties[i].AsFloats().Count; j++)
                        {
                            sb.Append(rd.Properties[i].AsFloats()[j]).Append(", ");
                        }

                        tekst += sb.ToString(0, sb.Length - 2) + "\n";
                    }
                    else
                    {
                        tekst += "Empty float vector" + "\n";
                    }
                    break;

                case PropertyType.StringVector:
                    if (rd.Properties[i].AsStrings().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        for (int j = 0; j < rd.Properties[i].AsStrings().Count; j++)
                        {
                            sb.Append(rd.Properties[i].AsStrings()[j]).Append(", ");
                        }

                        tekst += sb.ToString(0, sb.Length - 2) + "\n";
                    }
                    else
                    {
                        tekst += "Empty string vector" + "\n";
                    }
                    break;

                case PropertyType.EnumVector:
                    if (rd.Properties[i].AsEnums().Count > 0)
                    {
                        sb = new StringBuilder(100);
                        EnumDescs enumDescs = new EnumDescs();

                        for (int j = 0; j < rd.Properties[i].AsEnums().Count; j++)
                        {
                            try
                            {
                                sb.Append(String.Format("{0}", enumDescs.GetStringFromEnum(rd.Properties[i].Id, rd.Properties[i].AsEnums()[j]))).Append(", ");
                            }
                            catch (Exception)
                            {
                                sb.Append(String.Format("{0}", rd.Properties[i].AsEnums()[j])).Append(", ");
                            }
                        }

                        tekst += sb.ToString(0, sb.Length - 2) + "\n";
                    }
                    else
                    {
                        tekst += "Empty enum vector" + "\n";
                    }
                    break;

                default:
                    throw new Exception("Failed to export Resource Description as XML. Invalid property type.");
                }
            }


            tekst += "\n\n";
            return(tekst);
        }