From ea3983ecf8d46818d3a15d68179910d03c7d95e0 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Sat, 1 Feb 2025 16:10:55 +0000 Subject: [PATCH 01/16] WIP: Implemented partial featuires for IfcObjects as cross schema extensions. --- Tests/Ifc4x3ExtensionsTests.cs | 298 +++++++++++++++ Xbim.Ifc/Extensions/IIfcObjectExtensions.cs | 404 ++++++++++++++++++++ Xbim.Ifc4x3/Kernel/IfcObjectPartial.cs | 30 ++ 3 files changed, 732 insertions(+) create mode 100644 Tests/Ifc4x3ExtensionsTests.cs create mode 100644 Xbim.Ifc/Extensions/IIfcObjectExtensions.cs create mode 100644 Xbim.Ifc4x3/Kernel/IfcObjectPartial.cs diff --git a/Tests/Ifc4x3ExtensionsTests.cs b/Tests/Ifc4x3ExtensionsTests.cs new file mode 100644 index 000000000..1d72a24ba --- /dev/null +++ b/Tests/Ifc4x3ExtensionsTests.cs @@ -0,0 +1,298 @@ +using FluentAssertions; +using System; +using System.Linq; +using Xbim.Common; +using Xbim.Ifc; +using Xbim.IO.Memory; +using Xunit; +using XbimCommonSchema = Xbim.Ifc4; + + +namespace Xbim.Essentials.Tests +{ + public class Ifc4x3ExtensionsTests : IDisposable + { + protected IModel Model { get; set; } + protected ITransaction Txn { get; set; } + + public Ifc4x3ExtensionsTests() + { + Model = new MemoryModel(new Ifc4x3.EntityFactoryIfc4x3Add2()); + Txn = Model.BeginTransaction("Test"); + } + + [Fact] + public void CanAddDefiningType() + { + var pile = Model.Instances.New(); + var type = Model.Instances.New(); + pile.AddDefiningType(type); + + var relatingType = pile.IsTypedBy.First().RelatingType; + relatingType.Should().NotBeNull(); + relatingType.Should().Be(type); + } + + [Fact] + public void CanAddPropertySet() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p=> + { + p.Name = "Pset_Test"; + }); + pile.AddPropertySet(pset); + + var pset2 = pile.PropertySets.First(); + pset2.Should().NotBeNull(); + pset2.Should().Be(pset); + } + + [Fact] + public void CanGetPropertySet() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p => p.Name = "Pset_Test"); + pile.AddPropertySet(pset); + + var pset2 = pile.GetPropertySet("Pset_Test"); + pset2.Should().NotBeNull(); + pset2.Should().Be(pset); + } + + [Fact] + public void GetPropertySetIsCaseSensitive() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p => p.Name = "Pset_Test"); + pile.AddPropertySet(pset); + + var pset2 = pile.GetPropertySet("pset_test"); + pset2.Should().BeNull(); + } + + [Fact] + public void GetPropertySetCanBeCaseInsensitive() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p => p.Name = "Pset_Test"); + pile.AddPropertySet(pset); + + var pset2 = pile.GetPropertySet("pset_test", false); + + pset2.Should().NotBeNull(); + pset2.Should().Be(pset); + } + + [Fact] + public void CanGetPropertySingle() + { + var pile = Model.Instances.New(); + var prop = Model.Instances.New(p=> + { + p.Name = "SomeValue"; + p.NominalValue = new Ifc4x3.MeasureResource.IfcLabel("Abc"); + }); + var pset = Model.Instances.New(p => + { + p.Name = "Pset_Test"; + p.HasProperties.Add(prop); + }); + pile.AddPropertySet(pset); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeValue"); + value.Should().NotBeNull(); + value.NominalValue.Value.Should().Be("Abc"); + } + + [Fact] + public void CanGetPropertySingleValue() + { + var pile = Model.Instances.New(); + var prop = Model.Instances.New(p => + { + p.Name = "SomeNumber"; + p.NominalValue = new Ifc4x3.MeasureResource.IfcReal(100.5d); + }); + var pset = Model.Instances.New(p => + { + p.Name = "Pset_Test"; + p.HasProperties.Add(prop); + }); + pile.AddPropertySet(pset); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeNumber"); + value.Should().NotBeNull(); + value.Value.Should().Be(100.5); + } + + [Fact] + public void CanSetPropertySingleValue() + { + var pile = Model.Instances.New(); + + pile.SetPropertySingleValue("Pset_Test", "SomeProp", typeof(XbimCommonSchema.MeasureResource.IfcReal)); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeProp"); + value.Should().NotBeNull(); + value.Value.Should().Be(0); + } + + + [Fact] + public void CanSetPropertySingleValueGeneric() + { + var pile = Model.Instances.New(); + + pile.SetPropertySingleValue("Pset_Test", "SomeProp"); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeProp"); + value.Should().NotBeNull(); + value.Value.Should().Be(0); + } + + [Fact] + public void CanSetPropertySingleValueGenericEdgeCase() + { + var pile = Model.Instances.New(); + + pile.SetPropertySingleValue("Pset_Test", "SomeProp"); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeProp"); + value.Should().NotBeNull(); + value.Value.Should().Be(1.0); + } + + [Fact] + public void CanAddElementAndReadQuantity() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var quantities = pile.GetElementQuantity("BaseQuants"); + quantities.Should().NotBeNull(); + var val = quantities.Quantities.First(q => q.Name == "GrossArea"); + + val.Should().BeOfType(); + (val as Ifc4x3.QuantityResource.IfcQuantityArea).AreaValue.Value.Should().Be(123.4d); + + } + + [Fact] + public void CanAddElementAndReadPhysicalQuantity() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var val = pile.GetQuantity("GrossArea"); + val.Should().NotBeNull(); + val.AreaValue.Value.Should().Be(123.4d); + } + + [Fact] + public void CanAddElementAndReadPhysicalQuantityWithPset() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var val = pile.GetQuantity("BaseQuants", "GrossArea"); + val.Should().NotBeNull(); + val.AreaValue.Value.Should().Be(123.4d); + } + + [Fact] + public void CanAddElementAndReadPhysicalSimpleQuantityWithPset() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var val = pile.GetElementPhysicalSimpleQuantity("BaseQuants", "GrossArea"); + val.Should().NotBeNull(); + val.Should().BeOfType(); + } + + [InlineData("GFA", XbimQuantityTypeEnum.Area, 15.5d, Ifc4x3.MeasureResource.IfcSIUnitName.SQUARE_METRE)] + [InlineData("Width", XbimQuantityTypeEnum.Length, 1200.4d, Ifc4x3.MeasureResource.IfcSIUnitName.METRE)] + [InlineData("Volume", XbimQuantityTypeEnum.Volume, 12234d, Ifc4x3.MeasureResource.IfcSIUnitName.CUBIC_METRE)] + [InlineData("Count", XbimQuantityTypeEnum.Count, 14d, null)] + [InlineData("Weight", XbimQuantityTypeEnum.Weight, 999, Ifc4x3.MeasureResource.IfcSIUnitName.GRAM, Ifc4x3.MeasureResource.IfcSIPrefix.KILO)] + [InlineData("Duration", XbimQuantityTypeEnum.Time, 10d, Ifc4x3.MeasureResource.IfcSIUnitName.SECOND)] + [Theory] + public void CanSetElementPhysicalSimpleQuantity(string quantName, XbimQuantityTypeEnum measure, double value, + Ifc4x3.MeasureResource.IfcSIUnitName? unitType, Ifc4x3.MeasureResource.IfcSIPrefix? unitPrefix = null) + { + var space = Model.Instances.New(); + Ifc4x3.MeasureResource.IfcNamedUnit unit = null; + if(unitType != null) + { + unit = Model.Instances.New(u => + { + u.Name = unitType.Value; + u.Prefix = unitPrefix; + }); + } + + space.SetElementPhysicalSimpleQuantity("BaseQuants", quantName, value, measure, unit); + + Ifc4x3.MeasureResource.IfcMeasureValue val = measure switch + { + XbimQuantityTypeEnum.Area => space.GetQuantity("BaseQuants", quantName).AreaValue, + XbimQuantityTypeEnum.Length => space.GetQuantity("BaseQuants", quantName).LengthValue, + XbimQuantityTypeEnum.Volume => space.GetQuantity("BaseQuants", quantName).VolumeValue, + XbimQuantityTypeEnum.Count => space.GetQuantity("BaseQuants", quantName).CountValue, + XbimQuantityTypeEnum.Weight => space.GetQuantity("BaseQuants", quantName).WeightValue, + XbimQuantityTypeEnum.Time => space.GetQuantity("BaseQuants", quantName).TimeValue, + _ => throw new NotImplementedException(), + }; + + val.Value.Should().Be(value); + //area.Unit.FullName.Should().Be("SQUAREMETRE"); + + } + + #region Dispose + private bool disposedValue; + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + Txn.Dispose(); + Model?.Dispose(); + } + + disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/Xbim.Ifc/Extensions/IIfcObjectExtensions.cs b/Xbim.Ifc/Extensions/IIfcObjectExtensions.cs new file mode 100644 index 000000000..019826055 --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcObjectExtensions.cs @@ -0,0 +1,404 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public static class IIfcObjectExtensions + { + /// + /// Adds an element type to the object if it doesn't already have one, return the new or existing relationship that holds the type and this element. If there is a relationship for this type but this element is not related it adds it to the exosting relationship + /// + /// + /// + /// + public static IIfcRelDefinesByType AddDefiningType(this IIfcObject obj, IIfcTypeObject theType) + { + + var typedefs = obj.Model.Instances.Where(r => r.RelatingType == theType).ToList(); + var thisTypeDef = typedefs.FirstOrDefault(r => r.RelatedObjects.Contains(obj)); + if (thisTypeDef != null) return thisTypeDef; // it is already type related + var anyTypeDef = typedefs.FirstOrDefault(); //take any one of the rels of the type + if (anyTypeDef != null) + { + anyTypeDef.RelatedObjects.Add(obj); + return anyTypeDef; + } + var factory = new EntityCreator(obj.Model); + var newdef = factory.RelDefinesByType(r => r.RelatingType = theType); + newdef.RelatedObjects.Add(obj); + + return newdef; + } + + /// + /// Adds an existing property set to the object, NB no check is done for duplicate psets + /// + /// + /// + public static void AddPropertySet(this IIfcObject obj, IIfcPropertySet pSet) + { + + var relDef = obj.Model.Instances.OfType().FirstOrDefault(r => pSet.Equals(r.RelatingPropertyDefinition)); + if (relDef == null) + { + var factory = new EntityCreator(obj.Model); + relDef = factory.RelDefinesByProperties(r => r.RelatingPropertyDefinition = pSet); + } + relDef.RelatedObjects.Add(obj); + } + + private static IEnumerable GetPropertySets(this IIfcObject obj) + { + var pSets = obj.IsDefinedBy.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions); + return pSets.OfType(); + } + + /// + /// Returns the propertyset of the specified name, null if it does not exist + /// + /// + /// + /// + /// + public static IIfcPropertySet GetPropertySet(this IIfcObject obj, string pSetName, bool caseSensitive = true) + { + return obj.GetPropertySets().FirstOrDefault(pset => string.Compare(pSetName, pset.Name, !caseSensitive) == 0); + } + + /// + /// Returns the first single property matching the pset and property name, null if none exists + /// + /// + /// + /// + /// + public static IIfcPropertySingleValue GetPropertySingleValue(this IIfcObject obj, string pSetName, string propertyName) + { + var pset = obj.GetPropertySet(pSetName); + return pset != null ? pset.HasProperties.OfType().FirstOrDefault(p => p.Name == propertyName) : null; + } + + /// + /// Returns the value of the first single property matching the pset and property name, null if none exists + /// + /// + /// + /// + /// + /// + public static TValueType GetPropertySingleValue(this IIfcObject obj, string pSetName, string propertyName) where TValueType : IIfcValue + { + var pset = obj.GetPropertySet(pSetName); + if (pset == null) return default; + var pVal = + pset.HasProperties.OfType().FirstOrDefault(p => p.Name == propertyName); + if (pVal != null && pVal.NominalValue is TValueType) return (TValueType)pVal.NominalValue; + return default; + } + + /// + /// If the property value exists, returns the Nominal Value of the contents + /// + /// + /// + /// + /// + public static IIfcValue GetPropertySingleNominalValue(this IIfcObject obj, string pSetName, string propertyName) + { + var psv = obj.GetPropertySingleValue(pSetName, propertyName); + return psv == null ? null : psv.NominalValue; + } + + + /// + /// Creates property single value with specified type and default value of this type (0 for numeric types, empty string or string types and false for bool types) + /// + /// + /// + /// + /// + /// + public static IIfcPropertySingleValue SetPropertySingleValue(this IIfcObject obj, string pSetName, string propertyName) where T : IIfcValue + { + return obj.SetPropertySingleValue(pSetName, propertyName, typeof(T)); + } + + /// + /// Creates property single value with specified type and default value of this type (0 for numeric types, empty string or string types and false for bool types) + /// + /// + /// Property set name + /// Property name + /// Type of the property + /// Property single value with default value of the specified type + public static IIfcPropertySingleValue SetPropertySingleValue(this IIfcObject obj, string pSetName, string propertyName, Type type) + { + if (typeof(IIfcValue).GetTypeInfo().IsAssignableFrom(type)) + { + IIfcValue value; + if (typeof(Ifc4.MeasureResource.IfcPositiveLengthMeasure).GetTypeInfo().IsAssignableFrom(type)) + value = Activator.CreateInstance(type, 1.0) as IIfcValue; + else + value = Activator.CreateInstance(type) as IIfcValue; + + if (value != null) + return obj.SetPropertySingleValue(pSetName, propertyName, value); + throw new Exception("Type '" + type.Name + "' can't be initialized."); + } + throw new ArgumentException("Type '" + type.Name + "' is not compatible with IfcValue type."); + } + + /// + /// Creates a property single, or updates an existing matching one with the supplied + /// + /// + /// + /// + /// + /// + public static IIfcPropertySingleValue SetPropertySingleValue(this IIfcObject obj, string pSetName, string propertyName, IIfcValue value) + { + var pset = obj.GetPropertySet(pSetName); + var factory = new EntityCreator(obj.Model); + if (pset == null) + { + pset = factory.PropertySet(); + pset.Name = pSetName; + var relDef = factory.RelDefinesByProperties(r => + { + r.RelatingPropertyDefinition = pset; + r.RelatedObjects.Add(obj); + }); + } + + //change existing property of the same name from the property set + var singleVal = obj.GetPropertySingleValue(pSetName, propertyName); + if (singleVal != null) + { + singleVal.NominalValue = value; + } + else + { + singleVal = factory.PropertySingleValue(psv => { psv.Name = propertyName; psv.NominalValue = value; }); + pset.HasProperties.Add(singleVal); + } + + return singleVal; + } + + //TODO: would this be more logical on IIfcBuilding not IIfcObject + /// + /// Returns a list of all the elements that bound the external of the building + /// + /// + /// + public static IEnumerable GetExternalElements(this IIfcObject obj) + { + return obj.Model.Instances.OfType().Where(r => r.InternalOrExternalBoundary == IfcInternalOrExternalEnum.EXTERNAL + && r.PhysicalOrVirtualBoundary == IfcPhysicalOrVirtualEnum.PHYSICAL + && r.RelatedBuildingElement != null).Select(rsb => rsb.RelatedBuildingElement).Distinct(); + } + + public static IIfcElementQuantity GetElementQuantity(this IIfcObject obj, string quantityName, bool caseSensitive = true) + { + var qSets = obj.IsDefinedBy.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions).OfType(); + return qSets.FirstOrDefault(qset => string.Compare(quantityName, qset.Name, !caseSensitive) == 0); + } + + /// + /// Returns the first quantity in the property set pSetName of name qName + /// + /// + /// + /// + /// + /// + public static TQType GetQuantity(this IIfcObject obj, string pSetName, string quantityName) where TQType : IIfcPhysicalQuantity + { + var propSets = obj.IsDefinedBy.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions); + var rel = propSets.FirstOrDefault(r => r is IIfcElementQuantity && r.Name == pSetName); + if (rel == null) return default; + var eQ = rel as IIfcElementQuantity; + return eQ == null ? default : eQ.Quantities.OfType().FirstOrDefault(q => q.Name == quantityName); + } + + /// + /// Returns the first quantity that matches the quantity name + /// + /// + /// + /// + /// + public static TQType GetQuantity(this IIfcObject obj, string quantityName) where TQType : IIfcPhysicalQuantity + { + var qSets = obj.IsDefinedBy.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions).OfType(); + return qSets.SelectMany(qset => qset.Quantities).OfType().FirstOrDefault(q => q.Name == quantityName); + } + + + /// + /// Adds a new IfcPhysicalQuantity to the IfcElementQuantity called propertySetName + /// + /// + /// Name of the IfcElementQuantity property set + /// quantity to be added + /// Sets the method of measurement, if not null overrides previous value + public static IIfcElementQuantity AddQuantity(this IIfcObject obj, string psetName, IIfcPhysicalQuantity quantity, string methodOfMeasurement = null) + { + var pset = obj.GetElementQuantity(psetName); + + if (pset == null) + { + var factory = new EntityCreator(obj.Model); + pset = factory.ElementQuantity(p => p.Name = psetName); + var relDef = factory.RelDefinesByProperties(r => + { + r.RelatingPropertyDefinition = pset; + r.RelatedObjects.Add(obj); + + }); + } + pset.Quantities.Add(quantity); + if (!string.IsNullOrEmpty(methodOfMeasurement)) pset.MethodOfMeasurement = methodOfMeasurement; + return pset; + } + + + /// + /// Returns simple physical quality of the element. + /// + /// + /// + /// + /// + public static IIfcPhysicalSimpleQuantity GetElementPhysicalSimpleQuantity(this IIfcObject obj, string pSetName, string qualityName) + { + var elementQuality = obj.GetElementQuantity(pSetName); + if (elementQuality != null) + { + return elementQuality.Quantities.FirstOrDefault(sq => sq.Name == qualityName); + } + return null; + } + + /// + /// Removes a matching single value property + /// + /// + /// + /// + public static void RemovePropertySingleValue(this IIfcObject obj, string pSetName, string propertyName) + { + var pset = obj.GetPropertySet(pSetName); + if (pset != null) + { + var singleValue = pset.HasProperties.FirstOrDefault(p => p.Name == propertyName); + if (singleValue != null) + { + pset.HasProperties.Remove(singleValue); + } + } + + } + + /// + /// Removes a matching simple quantity + /// + /// + /// + /// + public static void RemoveElementPhysicalSimpleQuantity(this IIfcObject obj, string pSetName, string qualityName) + { + var elementQuality = obj.GetElementQuantity(pSetName); + if (elementQuality != null) + { + var simpleQuality = elementQuality.Quantities.FirstOrDefault(sq => sq.Name == qualityName); + if (simpleQuality != null) + { + elementQuality.Quantities.Remove(simpleQuality); + } + } + } + + /// + /// Sets a simple Physical Quantity and value on this object. + /// + /// + /// + /// + /// + /// + /// + public static void SetElementPhysicalSimpleQuantity(this IIfcObject obj, string qSetName, string qualityName, double value, XbimQuantityTypeEnum quantityType, + IIfcNamedUnit unit) + { + + var factory = new EntityCreator(obj.Model); + var qset = obj.GetElementQuantity(qSetName); + if (qset == null) + { + qset = factory.ElementQuantity(q => + { + q.Name = qSetName; + }); + var relDef = factory.RelDefinesByProperties(prop => + { + prop.RelatingPropertyDefinition = qset; + prop.RelatedObjects.Add(obj); + }); + + } + + //remove existing simple quality + var simpleQuality = obj.GetElementPhysicalSimpleQuantity(qSetName, qualityName); + if (simpleQuality != null) + { + var elementQuality = obj.GetElementQuantity(qSetName); + elementQuality.Quantities.Remove(simpleQuality); + obj.Model.Delete(simpleQuality); + } + + switch (quantityType) + { + case XbimQuantityTypeEnum.Area: + simpleQuality = factory.QuantityArea(sq => sq.AreaValue = (Ifc4.MeasureResource.IfcAreaMeasure)value); + break; + case XbimQuantityTypeEnum.Count: + simpleQuality = factory.QuantityCount(sq => sq.CountValue = (Ifc4.MeasureResource.IfcCountMeasure)value); + break; + case XbimQuantityTypeEnum.Length: + simpleQuality = factory.QuantityLength(sq => sq.LengthValue = (Ifc4.MeasureResource.IfcLengthMeasure)value); + break; + case XbimQuantityTypeEnum.Time: + simpleQuality = factory.QuantityTime(sq => sq.TimeValue = (Ifc4.MeasureResource.IfcTimeMeasure)value); + break; + case XbimQuantityTypeEnum.Volume: + simpleQuality = factory.QuantityVolume(sq => sq.VolumeValue = (Ifc4.MeasureResource.IfcVolumeMeasure)value); + break; + case XbimQuantityTypeEnum.Weight: + simpleQuality = factory.QuantityWeight(sq => sq.WeightValue = (Ifc4.MeasureResource.IfcMassMeasure)value); + break; + default: + return; + } + + simpleQuality.Unit = unit; + simpleQuality.Name = qualityName; + + qset.Quantities.Add(simpleQuality); + } + + } + public enum XbimQuantityTypeEnum + { + Length, + Area, + Volume, + Count, + Weight, + Time + } +} diff --git a/Xbim.Ifc4x3/Kernel/IfcObjectPartial.cs b/Xbim.Ifc4x3/Kernel/IfcObjectPartial.cs new file mode 100644 index 000000000..7b1808089 --- /dev/null +++ b/Xbim.Ifc4x3/Kernel/IfcObjectPartial.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc4x3.Kernel +{ + public partial class IfcObject + { + /// + /// Returns all property sets related to this object + /// + public IEnumerable PropertySets => IsDefinedBy.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions).OfType(); + + + /// + /// Returns all element quantities related to this object + /// + /// All related element quantities + public IEnumerable ElementQuantities => IsDefinedBy.SelectMany(r => r.RelatingPropertyDefinition.PropertySetDefinitions).OfType(); + + + /// + /// Returne all physical simple quantities (like length, area, volume, count, etc.) + /// + /// All physical simple quantities (like length, area, volume, count, etc.) + public IEnumerable PhysicalSimpleQuantities => ElementQuantities.SelectMany(eq => eq.Quantities).OfType(); + } + +} From 8820d6de2a02ed15fc46dfe00bad25788f796a28 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Sun, 2 Feb 2025 12:58:35 +0000 Subject: [PATCH 02/16] Added ActorResource and DateTimeResource partials for 4x3 Centralised Duration [de]serilisation logic across IFC4 & 4x3 --- .../XbimExtensions/TimeSpanExtensions.cs | 119 ++++++++++++++++++ Xbim.Ifc/Extensions/IIfcObjectExtensions.cs | 49 +++----- Xbim.Ifc4/DateTimeResource/IfcDatePartial.cs | 7 +- .../DateTimeResource/IfcDateTimePartial.cs | 7 +- .../DateTimeResource/IfcDurationPartial.cs | 99 +-------------- Xbim.Ifc4/DateTimeResource/IfcTimePartial.cs | 6 +- .../ActorResource/IfcActorRole.Partial.cs | 54 ++++++++ .../DateTimeResource/IfcDate.Partial.cs | 26 ++++ .../DateTimeResource/IfcDateTime.Partial.cs | 26 ++++ .../DateTimeResource/IfcDuration.Partial.cs | 37 ++++++ .../DateTimeResource/IfcTime.Partial.cs | 22 ++++ .../DateTimeResource/IfcTimeStamp.Partial.cs | 40 ++++++ ...cObjectPartial.cs => IfcObject.Partial.cs} | 0 Xbim.Ifc4x3/Xbim.Ifc4x3.csproj | 3 + 14 files changed, 359 insertions(+), 136 deletions(-) create mode 100644 Xbim.Common/XbimExtensions/TimeSpanExtensions.cs create mode 100644 Xbim.Ifc4x3/ActorResource/IfcActorRole.Partial.cs create mode 100644 Xbim.Ifc4x3/DateTimeResource/IfcDate.Partial.cs create mode 100644 Xbim.Ifc4x3/DateTimeResource/IfcDateTime.Partial.cs create mode 100644 Xbim.Ifc4x3/DateTimeResource/IfcDuration.Partial.cs create mode 100644 Xbim.Ifc4x3/DateTimeResource/IfcTime.Partial.cs create mode 100644 Xbim.Ifc4x3/DateTimeResource/IfcTimeStamp.Partial.cs rename Xbim.Ifc4x3/Kernel/{IfcObjectPartial.cs => IfcObject.Partial.cs} (100%) diff --git a/Xbim.Common/XbimExtensions/TimeSpanExtensions.cs b/Xbim.Common/XbimExtensions/TimeSpanExtensions.cs new file mode 100644 index 000000000..51712aa1b --- /dev/null +++ b/Xbim.Common/XbimExtensions/TimeSpanExtensions.cs @@ -0,0 +1,119 @@ +using System; +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; + +namespace Xbim.Common.XbimExtensions +{ + public static class TimeSpanExtensions + { + /// + /// Convert a duration formatted as a ISO8601 string to a + /// + /// + /// The + public static TimeSpan Iso8601DurationToTimeSpan(this string value) + { + if (string.IsNullOrWhiteSpace(value) || value[0] != 'P') + if (value[0] != '-' && value[1] != 'P') + return new TimeSpan(); + + var negative = value[0] == '-'; + var sign = negative ? -1 : 1; + + //https://www.w3.org/TR/xmlschema-2/#duration + //PnYnMnDTnHnMnS + + var daysTotal = 0; + var yReg = new Regex("(?[0-9]+)Y", RegexOptions.Compiled); + var yMatch = yReg.Match(value); + if (yMatch.Success) + daysTotal += (int)(int.Parse(yMatch.Groups["Y"].Value) * 365.25); + var mReg = new Regex("^[^T]+(?[0-9]+)M", RegexOptions.Compiled); + var mMatch = mReg.Match(value); + if (mMatch.Success) + daysTotal += (int)(int.Parse(mMatch.Groups["M"].Value) * 30.4166780729); + var dReg = new Regex("(?[0-9]+)D", RegexOptions.Compiled); + var dMatch = dReg.Match(value); + if (dMatch.Success) + daysTotal += int.Parse(dMatch.Groups["D"].Value); + + var hours = 0; + var hReg = new Regex("(?[0-9]+)H", RegexOptions.Compiled); + var hMatch = hReg.Match(value); + if (hMatch.Success) + hours = int.Parse(hMatch.Groups["H"].Value); + + var minutes = 0; + var miReg = new Regex("T[0-9]*H?(?[0-9]+)M", RegexOptions.Compiled); + var miMatch = miReg.Match(value); + if (miMatch.Success) + minutes = int.Parse(miMatch.Groups["M"].Value); + + var seconds = 0.0; + var sReg = new Regex("(?[0-9]+\\.?[0-9]*)S", RegexOptions.Compiled); + var sMatch = sReg.Match(value); + if (sMatch.Success) + seconds = float.Parse(sMatch.Groups["S"].Value, NumberStyles.Any, CultureInfo.InvariantCulture); + + return new TimeSpan( + sign * daysTotal, + sign * hours, + sign * minutes, + sign * (int)seconds, + sign * (int)((seconds - (int)seconds) * 1000)); + + } + + /// + /// Serialises this to an ISO8601 string representation. + /// + /// + /// + public static string ToIso8601Representation(this TimeSpan span) + { + StringBuilder sb = new StringBuilder(20); + var isNegative = span.Days < 0 || span.Hours < 0 || span.Minutes < 0 || span.Seconds < 0 || span.Milliseconds < 0; + + if (isNegative) + sb.Append('-'); + + sb.Append('P'); + + if (span.Days != 0) + { + sb.Append(Math.Abs(span.Days)); + sb.Append('D'); + } + + if (span.Hours != 0 || span.Minutes != 0 || span.Seconds != 0 || span.Milliseconds != 0) + { + sb.Append('T'); + if (span.Hours != 0) + { + sb.Append(Math.Abs(span.Hours)); + sb.Append('H'); + } + + if (span.Minutes != 0) + { + sb.Append(Math.Abs(span.Minutes)); + sb.Append('M'); + } + + if (span.Seconds != 0 || span.Milliseconds != 0) + { + var value = Math.Abs(span.Seconds) + Math.Abs(span.Milliseconds) / 1000f; + sb.Append(value.ToString("F3", CultureInfo.InvariantCulture)); + sb.Append('S'); + } + } + + // Zero is represented as "PT0S" + if (sb[sb.Length - 1] == 'P') + sb.Append("T0S"); + + return sb.ToString(); + } + } +} diff --git a/Xbim.Ifc/Extensions/IIfcObjectExtensions.cs b/Xbim.Ifc/Extensions/IIfcObjectExtensions.cs index 019826055..6e548043e 100644 --- a/Xbim.Ifc/Extensions/IIfcObjectExtensions.cs +++ b/Xbim.Ifc/Extensions/IIfcObjectExtensions.cs @@ -353,42 +353,33 @@ public static void SetElementPhysicalSimpleQuantity(this IIfcObject obj, string } //remove existing simple quality - var simpleQuality = obj.GetElementPhysicalSimpleQuantity(qSetName, qualityName); - if (simpleQuality != null) + var simpleQuantity = obj.GetElementPhysicalSimpleQuantity(qSetName, qualityName); + if (simpleQuantity != null) { var elementQuality = obj.GetElementQuantity(qSetName); - elementQuality.Quantities.Remove(simpleQuality); - obj.Model.Delete(simpleQuality); + elementQuality.Quantities.Remove(simpleQuantity); + obj.Model.Delete(simpleQuantity); } - switch (quantityType) + simpleQuantity = quantityType switch { - case XbimQuantityTypeEnum.Area: - simpleQuality = factory.QuantityArea(sq => sq.AreaValue = (Ifc4.MeasureResource.IfcAreaMeasure)value); - break; - case XbimQuantityTypeEnum.Count: - simpleQuality = factory.QuantityCount(sq => sq.CountValue = (Ifc4.MeasureResource.IfcCountMeasure)value); - break; - case XbimQuantityTypeEnum.Length: - simpleQuality = factory.QuantityLength(sq => sq.LengthValue = (Ifc4.MeasureResource.IfcLengthMeasure)value); - break; - case XbimQuantityTypeEnum.Time: - simpleQuality = factory.QuantityTime(sq => sq.TimeValue = (Ifc4.MeasureResource.IfcTimeMeasure)value); - break; - case XbimQuantityTypeEnum.Volume: - simpleQuality = factory.QuantityVolume(sq => sq.VolumeValue = (Ifc4.MeasureResource.IfcVolumeMeasure)value); - break; - case XbimQuantityTypeEnum.Weight: - simpleQuality = factory.QuantityWeight(sq => sq.WeightValue = (Ifc4.MeasureResource.IfcMassMeasure)value); - break; - default: - return; - } + XbimQuantityTypeEnum.Area => factory.QuantityArea(sq => sq.AreaValue = (Ifc4.MeasureResource.IfcAreaMeasure)value), + XbimQuantityTypeEnum.Length => factory.QuantityLength(sq => sq.LengthValue = (Ifc4.MeasureResource.IfcLengthMeasure)value), + XbimQuantityTypeEnum.Volume => factory.QuantityVolume(sq => sq.VolumeValue = (Ifc4.MeasureResource.IfcVolumeMeasure)value), + XbimQuantityTypeEnum.Count => factory.QuantityCount(sq => sq.CountValue = (Ifc4.MeasureResource.IfcCountMeasure)value), + XbimQuantityTypeEnum.Weight => factory.QuantityWeight(sq => sq.WeightValue = (Ifc4.MeasureResource.IfcMassMeasure)value), + XbimQuantityTypeEnum.Time => factory.QuantityTime(sq => sq.TimeValue = (Ifc4.MeasureResource.IfcTimeMeasure)value), + _ => default, + + }; + + if (simpleQuantity == null) + return; - simpleQuality.Unit = unit; - simpleQuality.Name = qualityName; + simpleQuantity.Unit = unit; + simpleQuantity.Name = qualityName; - qset.Quantities.Add(simpleQuality); + qset.Quantities.Add(simpleQuantity); } } diff --git a/Xbim.Ifc4/DateTimeResource/IfcDatePartial.cs b/Xbim.Ifc4/DateTimeResource/IfcDatePartial.cs index b0447a949..bec32678b 100644 --- a/Xbim.Ifc4/DateTimeResource/IfcDatePartial.cs +++ b/Xbim.Ifc4/DateTimeResource/IfcDatePartial.cs @@ -12,10 +12,9 @@ public DateTime ToDateTime() public static implicit operator DateTime(IfcDate obj) { - DateTime result; - DateTime.TryParse(obj._value, null, DateTimeStyles.RoundtripKind, out result); - return result; - + if (DateTime.TryParse(obj._value, null, DateTimeStyles.RoundtripKind, out DateTime result)) + return result; + return default; } public static implicit operator IfcDate(DateTime obj) diff --git a/Xbim.Ifc4/DateTimeResource/IfcDateTimePartial.cs b/Xbim.Ifc4/DateTimeResource/IfcDateTimePartial.cs index 76fab3988..e5721e708 100644 --- a/Xbim.Ifc4/DateTimeResource/IfcDateTimePartial.cs +++ b/Xbim.Ifc4/DateTimeResource/IfcDateTimePartial.cs @@ -12,10 +12,9 @@ public DateTime ToDateTime() public static implicit operator DateTime(IfcDateTime obj) { - DateTime result; - DateTime.TryParse(obj._value, null, DateTimeStyles.RoundtripKind, out result); - return result; - + if (DateTime.TryParse(obj._value, null, DateTimeStyles.RoundtripKind, out DateTime result)) + return result; + return default; } public static implicit operator IfcDateTime(DateTime obj) diff --git a/Xbim.Ifc4/DateTimeResource/IfcDurationPartial.cs b/Xbim.Ifc4/DateTimeResource/IfcDurationPartial.cs index 59a3f5eab..d7a98dc3b 100644 --- a/Xbim.Ifc4/DateTimeResource/IfcDurationPartial.cs +++ b/Xbim.Ifc4/DateTimeResource/IfcDurationPartial.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; using System.Xml; +using Xbim.Common.XbimExtensions; namespace Xbim.Ifc4.DateTimeResource { @@ -25,55 +21,7 @@ public static implicit operator IfcDuration(TimeSpan value) public static implicit operator TimeSpan(IfcDuration obj) { string value = obj; - if (string.IsNullOrWhiteSpace(value) || value[0] != 'P') - if (value[0] != '-' && value[1] != 'P') - return new TimeSpan(); - - var negative = value[0] == '-'; - var sign = negative ? -1 : 1; - - //https://www.w3.org/TR/xmlschema-2/#duration - //PnYnMnDTnHnMnS - - var daysTotal = 0; - var yReg = new Regex("(?[0-9]+)Y", RegexOptions.Compiled); - var yMatch = yReg.Match(value); - if (yMatch.Success) - daysTotal += (int)(int.Parse(yMatch.Groups["Y"].Value) * 365.25); - var mReg = new Regex("^[^T]+(?[0-9]+)M", RegexOptions.Compiled); - var mMatch = mReg.Match(value); - if (mMatch.Success) - daysTotal += (int)(int.Parse(mMatch.Groups["M"].Value) * 30.4166780729); - var dReg = new Regex("(?[0-9]+)D", RegexOptions.Compiled); - var dMatch = dReg.Match(value); - if (dMatch.Success) - daysTotal += int.Parse(dMatch.Groups["D"].Value); - - var hours = 0; - var hReg = new Regex("(?[0-9]+)H", RegexOptions.Compiled); - var hMatch = hReg.Match(value); - if (hMatch.Success) - hours = int.Parse(hMatch.Groups["H"].Value); - - var minutes = 0; - var miReg = new Regex("T[0-9]*H?(?[0-9]+)M", RegexOptions.Compiled); - var miMatch = miReg.Match(value); - if (miMatch.Success) - minutes = int.Parse(miMatch.Groups["M"].Value); - - var seconds = 0.0; - var sReg = new Regex("(?[0-9]+\\.?[0-9]*)S", RegexOptions.Compiled); - var sMatch = sReg.Match(value); - if (sMatch.Success) - seconds = float.Parse(sMatch.Groups["S"].Value, NumberStyles.Any, CultureInfo.InvariantCulture); - - return new TimeSpan( - sign * daysTotal, - sign * hours, - sign * minutes, - sign * (int)seconds, - sign * (int)((seconds - (int)seconds) * 1000)); - + return value.Iso8601DurationToTimeSpan(); } /// @@ -82,48 +30,7 @@ public static implicit operator TimeSpan(IfcDuration obj) /// private static string TimeSpanToString(TimeSpan span) { - StringBuilder sb = new StringBuilder(20); - var isNegative = span.Days < 0 || span.Hours < 0 || span.Minutes < 0 || span.Seconds < 0 || span.Milliseconds < 0; - - if (isNegative) - sb.Append('-'); - - sb.Append('P'); - - if (span.Days != 0) - { - sb.Append(Math.Abs(span.Days)); - sb.Append('D'); - } - - if (span.Hours != 0 || span.Minutes != 0 || span.Seconds != 0 || span.Milliseconds != 0) - { - sb.Append('T'); - if (span.Hours != 0) - { - sb.Append(Math.Abs(span.Hours)); - sb.Append('H'); - } - - if (span.Minutes != 0) - { - sb.Append(Math.Abs(span.Minutes)); - sb.Append('M'); - } - - if (span.Seconds != 0 || span.Milliseconds != 0) - { - var value = Math.Abs(span.Seconds) + Math.Abs(span.Milliseconds) / 1000f; - sb.Append(value.ToString("F3",CultureInfo.InvariantCulture)); - sb.Append('S'); - } - } - - // Zero is represented as "PT0S" - if (sb[sb.Length - 1] == 'P') - sb.Append("T0S"); - - return sb.ToString(); + return span.ToIso8601Representation(); } } diff --git a/Xbim.Ifc4/DateTimeResource/IfcTimePartial.cs b/Xbim.Ifc4/DateTimeResource/IfcTimePartial.cs index 36dc60d9e..52cef0491 100644 --- a/Xbim.Ifc4/DateTimeResource/IfcTimePartial.cs +++ b/Xbim.Ifc4/DateTimeResource/IfcTimePartial.cs @@ -6,9 +6,9 @@ public partial struct IfcTime { public static implicit operator DateTime(IfcTime obj) { - DateTime d; - DateTime.TryParse(obj, out d); - return d; + if(DateTime.TryParse(obj, out DateTime d)) + return d; + return default; } public static implicit operator IfcTime(DateTime obj) diff --git a/Xbim.Ifc4x3/ActorResource/IfcActorRole.Partial.cs b/Xbim.Ifc4x3/ActorResource/IfcActorRole.Partial.cs new file mode 100644 index 000000000..27f12bdbf --- /dev/null +++ b/Xbim.Ifc4x3/ActorResource/IfcActorRole.Partial.cs @@ -0,0 +1,54 @@ +using System; +using Xbim.Ifc4x3.MeasureResource; + +namespace Xbim.Ifc4x3.ActorResource +{ + public partial class IfcActorRole + { + /// + /// Converts a string to a Role or a User defined role if necessary + /// + /// + /// + /// + private static void ConvertRoleString(string value, ref IfcRoleEnum role, ref IfcLabel? userDefinedRole) + { + if (string.IsNullOrEmpty(value)) return; //illegal to set a role to nothing + var roleStr = value.Trim(); + + var roleWithoutSpaces = roleStr.Replace(" ", ""); + if (Enum.IsDefined(typeof(IfcRoleEnum), roleWithoutSpaces)) + { + var roleEnum = (IfcRoleEnum)Enum.Parse(typeof(IfcRoleEnum), roleWithoutSpaces, true); + role = roleEnum; //call this to ensure correct change notification + userDefinedRole = null; + } + else + { + userDefinedRole = roleStr; + role = IfcRoleEnum.USERDEFINED; + } + } + + /// + /// Gets or Sets the Role, if the name provided matches on of the Role enums, the enum is selected, otherwise a userdefined role is created. Use this to simplify binding + /// + public string RoleString + { + get + { + if(Role==IfcRoleEnum.USERDEFINED) + return UserDefinedRole; + return Role.ToString(); + } + set + { + IfcLabel? userDefinedRole = ""; + var role = new IfcRoleEnum(); + ConvertRoleString(value, ref role, ref userDefinedRole); + Role = role; + UserDefinedRole = userDefinedRole; + } + } + } +} diff --git a/Xbim.Ifc4x3/DateTimeResource/IfcDate.Partial.cs b/Xbim.Ifc4x3/DateTimeResource/IfcDate.Partial.cs new file mode 100644 index 000000000..eaeb008bd --- /dev/null +++ b/Xbim.Ifc4x3/DateTimeResource/IfcDate.Partial.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; + +namespace Xbim.Ifc4x3.DateTimeResource +{ + public partial struct IfcDate + { + public DateTime ToDateTime() + { + return this; + } + + public static implicit operator DateTime(IfcDate obj) + { + if(DateTime.TryParse(obj._value, null, DateTimeStyles.RoundtripKind, out DateTime result)) + return result; + return default; + } + + public static implicit operator IfcDate(DateTime obj) + { + obj = DateTime.SpecifyKind(obj, DateTimeKind.Unspecified); + return obj.ToString("yyyy-MM-dd"); + } + } +} diff --git a/Xbim.Ifc4x3/DateTimeResource/IfcDateTime.Partial.cs b/Xbim.Ifc4x3/DateTimeResource/IfcDateTime.Partial.cs new file mode 100644 index 000000000..a67112ac5 --- /dev/null +++ b/Xbim.Ifc4x3/DateTimeResource/IfcDateTime.Partial.cs @@ -0,0 +1,26 @@ +using System; +using System.Globalization; + +namespace Xbim.Ifc4x3.DateTimeResource +{ + public partial struct IfcDateTime + { + public DateTime ToDateTime() + { + return this; + } + + public static implicit operator DateTime(IfcDateTime obj) + { + if(DateTime.TryParse(obj._value, null, DateTimeStyles.RoundtripKind, out DateTime result)) + return result; + return default; + } + + public static implicit operator IfcDateTime(DateTime obj) + { + obj = DateTime.SpecifyKind(obj, DateTimeKind.Unspecified); + return obj.ToString("o"); + } + } +} diff --git a/Xbim.Ifc4x3/DateTimeResource/IfcDuration.Partial.cs b/Xbim.Ifc4x3/DateTimeResource/IfcDuration.Partial.cs new file mode 100644 index 000000000..61d29edd6 --- /dev/null +++ b/Xbim.Ifc4x3/DateTimeResource/IfcDuration.Partial.cs @@ -0,0 +1,37 @@ +using System; +using System.Xml; +using Xbim.Common.XbimExtensions; + +namespace Xbim.Ifc4x3.DateTimeResource +{ + public partial struct IfcDuration + { + public TimeSpan ToTimeSpan() + { + return XmlConvert.ToTimeSpan(Value.ToString()); + } + + public static implicit operator IfcDuration(TimeSpan value) + { + + //https://www.w3.org/TR/xmlschema-2/#duration + return new IfcDuration(TimeSpanToString(value)); + } + + public static implicit operator TimeSpan(IfcDuration obj) + { + string value = obj; + return value.Iso8601DurationToTimeSpan(); + } + + /// + /// Return the string representation according to xsd:duration rules, xdt:dayTimeDuration rules, or + /// xdt:yearMonthDuration rules. + /// + private static string TimeSpanToString(TimeSpan span) + { + return span.ToIso8601Representation(); + } + + } +} diff --git a/Xbim.Ifc4x3/DateTimeResource/IfcTime.Partial.cs b/Xbim.Ifc4x3/DateTimeResource/IfcTime.Partial.cs new file mode 100644 index 000000000..9ae5884ef --- /dev/null +++ b/Xbim.Ifc4x3/DateTimeResource/IfcTime.Partial.cs @@ -0,0 +1,22 @@ +using System; + +namespace Xbim.Ifc4x3.DateTimeResource +{ + public partial struct IfcTime + { + public static implicit operator DateTime(IfcTime obj) + { + if (DateTime.TryParse(obj, out DateTime d)) + return d; + return default; + } + + public static implicit operator IfcTime(DateTime obj) + { + var s = obj.ToString("O"); + //2009-06-15T13:45:30.0000000-07:00 + // ^ + return s.Substring(11); + } + } +} diff --git a/Xbim.Ifc4x3/DateTimeResource/IfcTimeStamp.Partial.cs b/Xbim.Ifc4x3/DateTimeResource/IfcTimeStamp.Partial.cs new file mode 100644 index 000000000..106a1169d --- /dev/null +++ b/Xbim.Ifc4x3/DateTimeResource/IfcTimeStamp.Partial.cs @@ -0,0 +1,40 @@ +using System; +using System.Globalization; + +namespace Xbim.Ifc4x3.DateTimeResource +{ + + public partial struct IfcTimeStamp + { + public DateTime ToDateTime() + { + var dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); //from 1970/1/1 00:00:00 + return dt.AddSeconds(this); + } + + public static implicit operator DateTime(IfcTimeStamp obj) + { + return obj.ToDateTime(); + + } + + public static implicit operator IfcTimeStamp(DateTime obj) + { + var dt = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); //from 1970/1/1 00:00:00 + var s = obj - dt; + return (long)s.TotalSeconds; + } + + public static implicit operator TimeSpan(IfcTimeStamp obj) + { + return TimeSpan.FromSeconds(obj); + } + + public static implicit operator IfcTimeStamp(TimeSpan obj) + { + return (long)obj.TotalSeconds; + } + + } + +} diff --git a/Xbim.Ifc4x3/Kernel/IfcObjectPartial.cs b/Xbim.Ifc4x3/Kernel/IfcObject.Partial.cs similarity index 100% rename from Xbim.Ifc4x3/Kernel/IfcObjectPartial.cs rename to Xbim.Ifc4x3/Kernel/IfcObject.Partial.cs diff --git a/Xbim.Ifc4x3/Xbim.Ifc4x3.csproj b/Xbim.Ifc4x3/Xbim.Ifc4x3.csproj index bb9de1073..40c70ccb0 100644 --- a/Xbim.Ifc4x3/Xbim.Ifc4x3.csproj +++ b/Xbim.Ifc4x3/Xbim.Ifc4x3.csproj @@ -12,5 +12,8 @@ + + $([System.String]::Copy(%(Filename)).Replace('.Partial', '.cs')) + From 9a1bfe223a842ecdfe5403f37b0e91115920e60d Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Mon, 3 Feb 2025 15:47:05 +0000 Subject: [PATCH 03/16] Further Extensions added --- .../Extensions/IIfcAppliedValueExtensions.cs | 104 ++++++++++++++++++ .../IIfcAxis2Placement2DExtensions.cs | 28 +++++ .../IIfcAxis2Placement3DExtensions.cs | 43 ++++++++ .../IIfcAxis2PlacementExtensions.cs | 19 ++++ .../IIfcCartesianPointExtensions.cs | 63 +++++++++++ .../Extensions/IIfcDirectionExtensions.cs | 64 +++++++++++ Xbim.Ifc/Extensions/IIfcProjectExtension.cs | 14 --- Xbim.Ifc/Extensions/IIfcProjectExtensions.cs | 73 ++++++++++++ 8 files changed, 394 insertions(+), 14 deletions(-) create mode 100644 Xbim.Ifc/Extensions/IIfcAppliedValueExtensions.cs create mode 100644 Xbim.Ifc/Extensions/IIfcAxis2Placement2DExtensions.cs create mode 100644 Xbim.Ifc/Extensions/IIfcAxis2Placement3DExtensions.cs create mode 100644 Xbim.Ifc/Extensions/IIfcAxis2PlacementExtensions.cs create mode 100644 Xbim.Ifc/Extensions/IIfcCartesianPointExtensions.cs create mode 100644 Xbim.Ifc/Extensions/IIfcDirectionExtensions.cs delete mode 100644 Xbim.Ifc/Extensions/IIfcProjectExtension.cs create mode 100644 Xbim.Ifc/Extensions/IIfcProjectExtensions.cs diff --git a/Xbim.Ifc/Extensions/IIfcAppliedValueExtensions.cs b/Xbim.Ifc/Extensions/IIfcAppliedValueExtensions.cs new file mode 100644 index 000000000..c79cb178c --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcAppliedValueExtensions.cs @@ -0,0 +1,104 @@ +using System; +using System.Text; +using Xbim.Ifc4.Interfaces; +using Xbim.Ifc4.MeasureResource; + +namespace Xbim.Ifc +{ + public static class IIfcAppliedValueExtensions + { + public static string AsString(this IIfcAppliedValue obj) + { + + StringBuilder value = new StringBuilder(); + if ((obj.Description.HasValue) && + (!string.IsNullOrEmpty(obj.Description)) + ) + { + value.Append(obj.Description); + value.Append(", "); + } + + if (obj.AppliedValue != null)//not nullable should be? incorrect name? + { + value.Append("AppliedValue: "); + if (obj.AppliedValue is IfcRatioMeasure) + { + var ifcRatioMeasure = (IfcRatioMeasure)obj.AppliedValue; + value.Append(string.Format("{0,0:N2}", ifcRatioMeasure.Value)); + } + if (obj.AppliedValue is IfcMonetaryMeasure) + { + IfcMonetaryMeasure ifcMonetaryMeasure = (IfcMonetaryMeasure)obj.AppliedValue; + value.Append(string.Format("{0,0:N2}", ifcMonetaryMeasure.Value)); + } + if (obj.AppliedValue is IfcMeasureWithUnit) + { + value.Append(((IfcMeasureWithUnit)obj.AppliedValue).AsString()); + + } + value.Append(", "); + } + + if (obj.UnitBasis != null) //not nullable should be? + { + value.Append("UnitBase: "); + value.Append(((IfcMeasureWithUnit)obj.UnitBasis).AsString()); + value.Append(", "); + } + if (obj.ApplicableDate != null) //not nullable should be? + { + value.Append("ApplicableDate: "); + value.Append(obj.ApplicableDate.ToString()); + value.Append(", "); + } + if (obj.FixedUntilDate != null) //not nullable should be? + { + value.Append("FixedUntilDate: "); + value.Append(obj.FixedUntilDate.ToString()); + value.Append(", "); + } + + if (obj is IIfcCostValue) + { + IIfcCostValue ifcCostValue = (IIfcCostValue)obj; + if (ifcCostValue.Category != null) + { + value.Append("CostType: "); + value.Append(ifcCostValue.Category); + value.Append(", "); + } + + if (ifcCostValue.Condition != null)//not nullable should be? + { + value.Append("Condition: "); + value.Append(ifcCostValue.Condition); + value.Append(", "); + } + } + if (obj is Ifc2x3.CostResource.IfcEnvironmentalImpactValue) + { + Ifc2x3.CostResource.IfcEnvironmentalImpactValue ifcEnvironmentalImpactValue = (Ifc2x3.CostResource.IfcEnvironmentalImpactValue)obj; + if (ifcEnvironmentalImpactValue.ImpactType != null) + { + value.Append("ImpactType: "); + value.Append(ifcEnvironmentalImpactValue.ImpactType); + value.Append(", "); + } + + //enum so should have a value as not nullable + value.Append("Category: "); + value.Append(ifcEnvironmentalImpactValue.Category.ToString()); + value.Append(", "); + + if (ifcEnvironmentalImpactValue.UserDefinedCategory != null)//not nullable should be? + { + value.Append("UserDefinedCategory: "); + value.Append(ifcEnvironmentalImpactValue.UserDefinedCategory); + value.Append(", "); + } + } + return value.ToString(); + } + } +} diff --git a/Xbim.Ifc/Extensions/IIfcAxis2Placement2DExtensions.cs b/Xbim.Ifc/Extensions/IIfcAxis2Placement2DExtensions.cs new file mode 100644 index 000000000..8608122f2 --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcAxis2Placement2DExtensions.cs @@ -0,0 +1,28 @@ +using System.Collections.Concurrent; +using Xbim.Common.Geometry; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public static class IIfcAxis2Placement2DExtensions + { + public static XbimMatrix3D ToMatrix3D(this IIfcAxis2Placement2D obj, ConcurrentDictionary maps = null) + { + object transform; + if (maps != null && maps.TryGetValue(obj.EntityLabel, out transform)) //already converted it just return cached + return (XbimMatrix3D)transform; + if (obj.RefDirection != null) + { + XbimVector3D v = obj.RefDirection.XbimVector3D(); + v.Normalized(); + transform = new XbimMatrix3D(v.X, v.Y, 0, 0, v.Y, v.X, 0, 0, 0, 0, 1, 0, obj.Location.X, obj.Location.Y, 0, 1); + } + else + transform = new XbimMatrix3D(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, obj.Location.X, obj.Location.Y, + obj.Location.Z, 1); + if (maps != null) maps.TryAdd(obj.EntityLabel, transform); + return (XbimMatrix3D)transform; + } + + } +} diff --git a/Xbim.Ifc/Extensions/IIfcAxis2Placement3DExtensions.cs b/Xbim.Ifc/Extensions/IIfcAxis2Placement3DExtensions.cs new file mode 100644 index 000000000..1be31ff56 --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcAxis2Placement3DExtensions.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Text; +using Xbim.Common.Geometry; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public static class IIfcAxis2Placement3DExtensions + { + public static XbimMatrix3D ToMatrix3D(this IIfcAxis2Placement3D obj, ConcurrentDictionary maps = null) + { + if (maps == null) + return obj.ConvertAxis3D(); + + object transform; + if (maps.TryGetValue(obj.EntityLabel, out transform)) //already converted it just return cached + return (XbimMatrix3D)transform; + + transform = obj.ConvertAxis3D(); + maps.TryAdd(obj.EntityLabel, transform); + return (XbimMatrix3D)transform; + } + + private static XbimMatrix3D ConvertAxis3D(this IIfcAxis2Placement3D obj) + { + if (obj.RefDirection == null || obj.Axis == null) + return new XbimMatrix3D(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, obj.Location.X, obj.Location.Y, + obj.Location.Z, 1); + + var za = obj.Axis.XbimVector3D(); + za.Normalized(); + var xa = obj.RefDirection.XbimVector3D(); + xa.Normalized(); + var ya = XbimVector3D.CrossProduct(za, xa); + ya.Normalized(); + return new XbimMatrix3D(xa.X, xa.Y, xa.Z, 0, ya.X, ya.Y, ya.Z, 0, za.X, za.Y, za.Z, 0, obj.Location.X, + obj.Location.Y, obj.Location.Z, 1); + } + + } +} diff --git a/Xbim.Ifc/Extensions/IIfcAxis2PlacementExtensions.cs b/Xbim.Ifc/Extensions/IIfcAxis2PlacementExtensions.cs new file mode 100644 index 000000000..14fee4602 --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcAxis2PlacementExtensions.cs @@ -0,0 +1,19 @@ +using Xbim.Common.Geometry; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public static class IIfcAxis2PlacementExtensions + { + public static XbimMatrix3D ToMatrix3D(this IIfcAxis2Placement placement) + { + return placement switch + { + IIfcAxis2Placement3D ax3 => ax3.ToMatrix3D(), + IIfcAxis2Placement2D ax2 => ax2.ToMatrix3D(), + _ => XbimMatrix3D.Identity + }; + } + + } +} diff --git a/Xbim.Ifc/Extensions/IIfcCartesianPointExtensions.cs b/Xbim.Ifc/Extensions/IIfcCartesianPointExtensions.cs new file mode 100644 index 000000000..028d8a52f --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcCartesianPointExtensions.cs @@ -0,0 +1,63 @@ +using Xbim.Common.Geometry; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public static class IIfcCartesianPointExtensions + { + public static void SetXY(this IIfcCartesianPoint obj, double x, double y) + { + obj.Coordinates.Clear(); + obj.Coordinates.Add(x); + obj.Coordinates.Add(y); + } + + public static void SetXYZ(this IIfcCartesianPoint obj, double x, double y, double z) + { + obj.Coordinates.Clear(); + obj.Coordinates.Add(x); + obj.Coordinates.Add(y); + obj.Coordinates.Add(z); + } + + public static XbimPoint3D ToXbimPoint3D(this IIfcCartesianPoint obj) + { + return new XbimPoint3D(obj.X, obj.Y, obj.Z); + } + + public static bool IsEqual(this IIfcCartesianPoint obj, IIfcCartesianPoint p, double tolerance) + { + return obj.DistanceSquared(p) <= (tolerance * tolerance); + } + + public static double DistanceSquared(this IIfcCartesianPoint obj, IIfcCartesianPoint p) + { + double d = 0, dd; + double x1, y1, z1, x2, y2, z2; + obj.XYZ(out x1, out y1, out z1); + p.XYZ(out x2, out y2, out z2); + dd = x1; dd -= x2; dd *= dd; d += dd; + dd = y1; dd -= y2; dd *= dd; d += dd; + dd = z1; dd -= z2; dd *= dd; d += dd; + return d; + } + + public static void XYZ(this IIfcCartesianPoint obj, out double x, out double y, out double z) + { + if (obj.Dim == 3) + { + + x = obj.Coordinates[0]; y = obj.Coordinates[1]; z = obj.Coordinates[2]; + } + else if (obj.Dim == 2) + { + + x = obj.Coordinates[0]; y = obj.Coordinates[1]; z = 0; + } + else + { + z = y = x = double.NaN; + } + } + } +} diff --git a/Xbim.Ifc/Extensions/IIfcDirectionExtensions.cs b/Xbim.Ifc/Extensions/IIfcDirectionExtensions.cs new file mode 100644 index 000000000..10bbf398f --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcDirectionExtensions.cs @@ -0,0 +1,64 @@ +using Xbim.Common.Geometry; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public static class IIfcDirectionExtensions + { + public static XbimVector3D XbimVector3D(this IIfcDirection obj) + { + return new XbimVector3D(obj.X, obj.Y, double.IsNaN(obj.Z) ? 0 : obj.Z); + } + + + /// + /// Computes and returns the normalised vector for the direction. + /// + /// A 1-length vector if the direction is meaningful or a 0-length vector otherwise + public static XbimVector3D Normalise(this IIfcDirection obj) + { + if (obj.Dim == 3) + { + var v3D = new XbimVector3D(obj.X, obj.Y, obj.Z); + v3D.Normalized(); + return v3D; + } + // Since the return value is not stored in any field or property + // and the function return variable is intrinsically 3D it's reasonable do + // deal with dimensions lower than 3 + // + var compX = obj.X; // each value is nan if the dimension is not specified + var compY = obj.Y; + var compZ = obj.Z; + + // substitite nan for 0 + if (double.IsNaN(compX)) + compX = 0; + if (double.IsNaN(compY)) + compY = 0; + if (double.IsNaN(compZ)) + compZ = 0; + + var otherCases = new XbimVector3D(compX, compY, compZ); + // normalied return a 0-len-vector if no significant direction exists + otherCases.Normalized(); + return otherCases; + } + + + public static void SetXY(this IIfcDirection obj, double x, double y) + { + obj.DirectionRatios.Clear(); + obj.DirectionRatios.Add(x); + obj.DirectionRatios.Add(y); + } + + public static void SetXYZ(this IIfcDirection obj,double x, double y, double z) + { + obj.DirectionRatios.Clear(); + obj.DirectionRatios.Add(x); + obj.DirectionRatios.Add(y); + obj.DirectionRatios.Add(z); + } + } +} diff --git a/Xbim.Ifc/Extensions/IIfcProjectExtension.cs b/Xbim.Ifc/Extensions/IIfcProjectExtension.cs deleted file mode 100644 index 8b54fe468..000000000 --- a/Xbim.Ifc/Extensions/IIfcProjectExtension.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Xbim.Ifc4.Interfaces; - -namespace Xbim.Ifc -{ - public static class IIfcProjectExtension - { - public static IEnumerable GetSpatialStructuralElements(this IIfcProject project) - { - return project.IsDecomposedBy.SelectMany(rel => rel.RelatedObjects.OfType()); - } - } -} diff --git a/Xbim.Ifc/Extensions/IIfcProjectExtensions.cs b/Xbim.Ifc/Extensions/IIfcProjectExtensions.cs new file mode 100644 index 000000000..b80a154e8 --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcProjectExtensions.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using System.Linq; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public static class IIfcProjectExtensions + { + public static IEnumerable GetSpatialStructuralElements(this IIfcProject project) + { + return project.IsDecomposedBy.SelectMany(rel => rel.RelatedObjects.OfType()); + } + + + + /// + /// Adds Site to the IsDecomposedBy Collection. + /// + public static void AddSite(this IIfcProject proj, IIfcSite site) + { + var decomposition = proj.IsDecomposedBy.FirstOrDefault(); + if (decomposition == null) //none defined create the relationship + { + var factory = new EntityCreator(proj.Model); + var relSub = factory.RelAggregates(r => + { + r.RelatingObject = proj; + r.RelatedObjects.Add(site); + }); + } + else + decomposition.RelatedObjects.Add(site); + } + + /// + /// Adds Building to the IsDecomposedBy Collection. + /// + public static void AddBuilding(this IIfcProject proj, IIfcBuilding building) + { + var decomposition = proj.IsDecomposedBy.FirstOrDefault(); + if (decomposition == null) //none defined create the relationship + { + var factory = new EntityCreator(proj.Model); + var relSub = factory.RelAggregates(r => + { + r.RelatingObject = proj; + r.RelatedObjects.Add(building); + }); + } + else + decomposition.RelatedObjects.Add(building); + } + + /// + /// Adds Ifc4x3 Facility to the IsDecomposedBy Collection. + /// + public static void AddFacility(this IIfcProject proj, Ifc4x3.ProductExtension.IfcFacility facility) + { + var decomposition = proj.IsDecomposedBy.FirstOrDefault(); + if (decomposition == null) //none defined create the relationship + { + var factory = new EntityCreator(proj.Model); + var relSub = factory.RelAggregates(r => + { + r.RelatingObject = proj; + r.RelatedObjects.Add(facility); + }); + } + else + decomposition.RelatedObjects.Add(facility); + } + } +} From 54bfeb0dbf5cc37e9702828ddc357c72499ba518 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Tue, 4 Feb 2025 10:23:33 +0000 Subject: [PATCH 04/16] AddedMonetary and related Unit handling logic to IFC4x3. Reintroduced (locale based) currency lookup. Refactored to monetary handling to centralise code across schemas --- Tests/Ifc4ExtensionsTests.cs | 316 ++++++++++++++++++ Tests/Ifc4x3ExtensionsTests.cs | 20 ++ Xbim.Ifc/Extensions/IIfcUnitExtensions.cs | 76 +++++ .../MeasureResource/IfcMonetaryUnitPartial.cs | 37 +- .../MeasureResource/IfcUnitExtensions.cs | 14 +- .../MeasureResource/IfcMonetaryUnitPartial.cs | 37 +- .../MeasureResource/IfcUnitExtensions.cs | 101 +++++- ...=> IfcPropertySetDefinitionSet.Partial.cs} | 0 .../IfcCompoundPlaneAngleMeasure.Partial.cs | 47 +++ .../IfcConversionBasedUnit.Partial.cs | 42 +++ 10 files changed, 609 insertions(+), 81 deletions(-) create mode 100644 Tests/Ifc4ExtensionsTests.cs create mode 100644 Xbim.Ifc/Extensions/IIfcUnitExtensions.cs rename Xbim.Ifc4x3/Kernel/{IfcPropertySetDefinitionSetPartial.cs => IfcPropertySetDefinitionSet.Partial.cs} (100%) create mode 100644 Xbim.Ifc4x3/MeasureResource/IfcCompoundPlaneAngleMeasure.Partial.cs create mode 100644 Xbim.Ifc4x3/MeasureResource/IfcConversionBasedUnit.Partial.cs diff --git a/Tests/Ifc4ExtensionsTests.cs b/Tests/Ifc4ExtensionsTests.cs new file mode 100644 index 000000000..239a8b224 --- /dev/null +++ b/Tests/Ifc4ExtensionsTests.cs @@ -0,0 +1,316 @@ +using FluentAssertions; +using System; +using System.Linq; +using Xbim.Common; +using Xbim.Ifc; +using Xbim.IO.Memory; +using Xunit; +using XbimCommonSchema = Xbim.Ifc4; + + +namespace Xbim.Essentials.Tests +{ + public class Ifc4ExtensionsTests : IDisposable + { + protected IModel Model { get; set; } + protected ITransaction Txn { get; set; } + + public Ifc4ExtensionsTests() + { + Model = new MemoryModel(new Ifc4.EntityFactoryIfc4()); + Txn = Model.BeginTransaction("Test"); + } + + [Fact] + public void CanAddDefiningType() + { + var pile = Model.Instances.New(); + var type = Model.Instances.New(); + pile.AddDefiningType(type); + + var relatingType = pile.IsTypedBy.First().RelatingType; + relatingType.Should().NotBeNull(); + relatingType.Should().Be(type); + } + + [Fact] + public void CanAddPropertySet() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p=> + { + p.Name = "Pset_Test"; + }); + pile.AddPropertySet(pset); + + var pset2 = pile.PropertySets.First(); + pset2.Should().NotBeNull(); + pset2.Should().Be(pset); + } + + [Fact] + public void CanGetPropertySet() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p => p.Name = "Pset_Test"); + pile.AddPropertySet(pset); + + var pset2 = pile.GetPropertySet("Pset_Test"); + pset2.Should().NotBeNull(); + pset2.Should().Be(pset); + } + + [Fact] + public void GetPropertySetIsCaseSensitive() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p => p.Name = "Pset_Test"); + pile.AddPropertySet(pset); + + var pset2 = pile.GetPropertySet("pset_test"); + pset2.Should().BeNull(); + } + + [Fact] + public void GetPropertySetCanBeCaseInsensitive() + { + var pile = Model.Instances.New(); + var pset = Model.Instances.New(p => p.Name = "Pset_Test"); + pile.AddPropertySet(pset); + + var pset2 = pile.GetPropertySet("pset_test", false); + + pset2.Should().NotBeNull(); + pset2.Should().Be(pset); + } + + [Fact] + public void CanGetPropertySingle() + { + var pile = Model.Instances.New(); + var prop = Model.Instances.New(p=> + { + p.Name = "SomeValue"; + p.NominalValue = new Ifc4.MeasureResource.IfcLabel("Abc"); + }); + var pset = Model.Instances.New(p => + { + p.Name = "Pset_Test"; + p.HasProperties.Add(prop); + }); + pile.AddPropertySet(pset); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeValue"); + value.Should().NotBeNull(); + value.NominalValue.Value.Should().Be("Abc"); + } + + [Fact] + public void CanGetPropertySingleValue() + { + var pile = Model.Instances.New(); + var prop = Model.Instances.New(p => + { + p.Name = "SomeNumber"; + p.NominalValue = new Ifc4.MeasureResource.IfcReal(100.5d); + }); + var pset = Model.Instances.New(p => + { + p.Name = "Pset_Test"; + p.HasProperties.Add(prop); + }); + pile.AddPropertySet(pset); + var x= pile.GetPropertySingleValue("", ""); + var value = pile.GetPropertySingleValue("Pset_Test", "SomeNumber"); + value.Should().NotBeNull(); + value.Value.Should().Be(100.5); + } + + [Fact] + public void CanSetPropertySingleValue() + { + var pile = Model.Instances.New(); + + pile.SetPropertySingleValue("Pset_Test", "SomeProp", typeof(XbimCommonSchema.MeasureResource.IfcReal)); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeProp"); + value.Should().NotBeNull(); + value.Value.Should().Be(0); + } + + + [Fact] + public void CanSetPropertySingleValueGeneric() + { + var pile = Model.Instances.New(); + + pile.SetPropertySingleValue("Pset_Test", "SomeProp"); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeProp"); + value.Should().NotBeNull(); + value.Value.Should().Be(0); + } + + [Fact] + public void CanSetPropertySingleValueGenericEdgeCase() + { + var pile = Model.Instances.New(); + + var value = pile.GetPropertySingleValue("Pset_Test", "SomeProp"); + value.Should().NotBeNull(); + value.Value.Should().Be(1.0); + } + + [Fact] + public void CanAddElementAndReadQuantity() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var quantities = pile.GetElementQuantity("BaseQuants"); + quantities.Should().NotBeNull(); + var val = quantities.Quantities.First(q => q.Name == "GrossArea"); + + val.Should().BeOfType(); + (val as Ifc4.QuantityResource.IfcQuantityArea).AreaValue.Value.Should().Be(123.4d); + + } + + [Fact] + public void CanAddElementAndReadPhysicalQuantity() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var val = pile.GetQuantity("GrossArea"); + val.Should().NotBeNull(); + val.AreaValue.Value.Should().Be(123.4d); + } + + [Fact] + public void CanAddElementAndReadPhysicalQuantityWithPset() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var val = pile.GetQuantity("BaseQuants", "GrossArea"); + val.Should().NotBeNull(); + val.AreaValue.Value.Should().Be(123.4d); + } + + [Fact] + public void CanAddElementAndReadPhysicalSimpleQuantityWithPset() + { + var pile = Model.Instances.New(); + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.AreaValue = 123.4d; + }); + pile.AddQuantity("BaseQuants", quant, "Some measure"); + + var val = pile.GetElementPhysicalSimpleQuantity("BaseQuants", "GrossArea"); + val.Should().NotBeNull(); + val.Should().BeOfType(); + } + + [InlineData("GFA", XbimQuantityTypeEnum.Area, 15.5d, Ifc4.Interfaces.IfcSIUnitName.SQUARE_METRE)] + [InlineData("Width", XbimQuantityTypeEnum.Length, 1200.4d, Ifc4.Interfaces.IfcSIUnitName.METRE)] + [InlineData("Volume", XbimQuantityTypeEnum.Volume, 12234d, Ifc4.Interfaces.IfcSIUnitName.CUBIC_METRE)] + [InlineData("Count", XbimQuantityTypeEnum.Count, 14d, null)] + [InlineData("Weight", XbimQuantityTypeEnum.Weight, 999, Ifc4.Interfaces.IfcSIUnitName.GRAM, Ifc4.Interfaces.IfcSIPrefix.KILO)] + [InlineData("Duration", XbimQuantityTypeEnum.Time, 10d, Ifc4.Interfaces.IfcSIUnitName.SECOND)] + [Theory] + public void CanSetElementPhysicalSimpleQuantity(string quantName, XbimQuantityTypeEnum measure, double value, + Ifc4.Interfaces.IfcSIUnitName? unitType, Ifc4.Interfaces.IfcSIPrefix? unitPrefix = null) + { + var space = Model.Instances.New(); + Ifc4.MeasureResource.IfcNamedUnit unit = null; + if(unitType != null) + { + unit = Model.Instances.New(u => + { + u.Name = unitType.Value; + u.Prefix = unitPrefix; + }); + } + + space.SetElementPhysicalSimpleQuantity("BaseQuants", quantName, value, measure, unit); + + Ifc4.MeasureResource.IfcMeasureValue val = measure switch + { + XbimQuantityTypeEnum.Area => space.GetQuantity("BaseQuants", quantName).AreaValue, + XbimQuantityTypeEnum.Length => space.GetQuantity("BaseQuants", quantName).LengthValue, + XbimQuantityTypeEnum.Volume => space.GetQuantity("BaseQuants", quantName).VolumeValue, + XbimQuantityTypeEnum.Count => space.GetQuantity("BaseQuants", quantName).CountValue, + XbimQuantityTypeEnum.Weight => space.GetQuantity("BaseQuants", quantName).WeightValue, + XbimQuantityTypeEnum.Time => space.GetQuantity("BaseQuants", quantName).TimeValue, + _ => throw new NotImplementedException(), + }; + + val.Value.Should().Be(value); + //area.Unit.FullName.Should().Be("SQUAREMETRE"); + + } + + [InlineData("USD", "$", "US Dollar")] + [InlineData("GBP", "£", "British Pound", "Pound Sterling")] + [InlineData("EUR", "€", "Euro", "euro")] // 'euro' since French culture picked up by default + [InlineData("CAD", "$", "Canadian Dollar")] + [InlineData("AUD", "$", "Australian Dollar")] + [InlineData("PLN", "zł", "Polish Zloty", "złoty polski")] + [Theory] + public void CanReadMonetaryUnit(string tla, string expectedSymbol, string expectedName, string nativeName = null) + { + nativeName = nativeName ?? expectedName; + var currency = Model.Instances.New(u => + { + u.Currency = tla; + }); + + currency.Symbol().Should().Be(expectedSymbol); + currency.FullEnglishName().Should().Be(expectedName); + currency.FullNativeName().Should().Be(nativeName); + } + + #region Dispose + private bool disposedValue; + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + Txn.Dispose(); + Model?.Dispose(); + } + + disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/Tests/Ifc4x3ExtensionsTests.cs b/Tests/Ifc4x3ExtensionsTests.cs index 1d72a24ba..403defa06 100644 --- a/Tests/Ifc4x3ExtensionsTests.cs +++ b/Tests/Ifc4x3ExtensionsTests.cs @@ -270,6 +270,26 @@ public void CanSetElementPhysicalSimpleQuantity(string quantName, XbimQuantityTy } + [InlineData("USD", "$", "US Dollar")] + [InlineData("GBP", "£", "British Pound", "Pound Sterling")] + [InlineData("EUR", "€", "Euro", "euro")] // 'euro' since French culture picked up by default + [InlineData("CAD", "$", "Canadian Dollar")] + [InlineData("AUD", "$", "Australian Dollar")] + [InlineData("PLN", "zł", "Polish Zloty", "złoty polski")] + [Theory] + public void CanReadMonetaryUnit(string tla, string expectedSymbol, string expectedName, string nativeName = null) + { + nativeName = nativeName ?? expectedName; + var currency = Model.Instances.New(u => + { + u.Currency = tla; + }); + + currency.Symbol().Should().Be(expectedSymbol); + currency.FullEnglishName().Should().Be(expectedName); + currency.FullNativeName().Should().Be(nativeName); + } + #region Dispose private bool disposedValue; diff --git a/Xbim.Ifc/Extensions/IIfcUnitExtensions.cs b/Xbim.Ifc/Extensions/IIfcUnitExtensions.cs new file mode 100644 index 000000000..07bac80b7 --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcUnitExtensions.cs @@ -0,0 +1,76 @@ +using Xbim.Ifc4.Interfaces; +using CrossSchema = Xbim.Ifc4; + +namespace Xbim.Ifc +{ + public static class IIfcUnitExtensions + { + public static string AsString(this IIfcMeasureWithUnit obj) + { + string value = string.Format("{0,0:N2}", obj.ValueComponent.Value); + var ifcUnit = obj.UnitComponent; + string unit = ifcUnit.Symbol(); + if (!string.IsNullOrEmpty(unit)) + { + value += unit; + } + return value; + } + + /// + /// Get the full name of the IfcUnit + /// + /// string holding full name + public static string Name(this IIfcUnit ifcUnit) + { + // Delegate to Ifc4/Cross schema implementation + return CrossSchema.MeasureResource.UnitExtensions.Name(ifcUnit); + } + /// + /// Get the symbol of the IfcUnit + /// + /// string holding symbol + public static string Symbol(this IIfcUnit ifcUnit) + { + // Delegate to Ifc4/Cross schema implementation + return CrossSchema.MeasureResource.UnitExtensions.Symbol(ifcUnit); + } + + /// + /// Gets the currency symbol (e.g. $, £, €, kr etc) for the + /// + /// + /// + public static string Symbol(this IIfcMonetaryUnit obj) + { + // Delegate to Ifc4/Cross schema implementation + return CrossSchema.MeasureResource.UnitExtensions.Symbol(obj); + } + + /// + /// Gets the currency name in English for the + /// + /// + /// + public static string FullEnglishName(this IIfcMonetaryUnit obj) + { + // Delegate to Ifc4/Cross schema implementation + return CrossSchema.MeasureResource.UnitExtensions.FullEnglishName(obj); + } + + /// + /// Gets the currency name in local culture for the + /// + /// Note: this is imprecise and inherently ambiguous due to different cultures installed, but for example + /// Polish PLN might be known natively as 'złoty polski' rather than 'Polish Zloty' + /// + /// + public static string FullNativeName(this IIfcMonetaryUnit obj) + { + // Delegate to Ifc4/Cross schema implementation + return CrossSchema.MeasureResource.UnitExtensions.FullNativeName(obj); + } + } + + +} diff --git a/Xbim.Ifc2x3/MeasureResource/IfcMonetaryUnitPartial.cs b/Xbim.Ifc2x3/MeasureResource/IfcMonetaryUnitPartial.cs index c9eff28d4..603035726 100644 --- a/Xbim.Ifc2x3/MeasureResource/IfcMonetaryUnitPartial.cs +++ b/Xbim.Ifc2x3/MeasureResource/IfcMonetaryUnitPartial.cs @@ -1,65 +1,50 @@ -using System.Globalization; -using System.Linq; +using Xbim.Ifc4.MeasureResource; namespace Xbim.Ifc2x3.MeasureResource { public partial class IfcMonetaryUnit { /// - /// Get Symbol string for money unit + /// Gets the Symbol string for money unit /// /// String holding symbol public string Symbol { get { - //string value = CultureInfo.GetCultures(CultureTypes.SpecificCultures) - // .Where(c => new RegionInfo(c.LCID).ISOCurrencySymbol == Currency.ToString()) - // .Select(c => new RegionInfo(c.LCID).CurrencySymbol) - // .FirstOrDefault(); - //return string.IsNullOrEmpty(value) ? Currency.ToString() : value; - return Currency.ToString(); + return this.Symbol(); } } /// - ///Get full English name of the currency + /// ets the name of the currency as its known internationally /// /// String as full name - public string FullEnglishName + public string FullEnglishName { get { - //string value = CultureInfo.GetCultures(CultureTypes.SpecificCultures) - // .Where(c => new RegionInfo(c.LCID).ISOCurrencySymbol == Currency.ToString()) - // .Select(c => new RegionInfo(c.LCID).CurrencyEnglishName) - // .FirstOrDefault(); - //return string.IsNullOrEmpty(value) ? Currency.ToString() : value; - return Currency.ToString(); + return this.FullEnglishName(); } } /// - ///Get full Native name of the currency + /// Gets the name of the currency as its known natively /// /// String holding full name - public string FullNativeName + public string FullNativeName { get { - //string value = CultureInfo.GetCultures(CultureTypes.SpecificCultures) - // .Where(c => new RegionInfo(c.LCID).ISOCurrencySymbol == Currency.ToString()) - // .Select(c => new RegionInfo(c.LCID).CurrencyNativeName) - // .FirstOrDefault(); - //return string.IsNullOrEmpty(value) ? Currency.ToString() : value; - return Currency.ToString(); + return this.FullNativeName(); } } + public string FullName { get { - return FullNativeName; + return FullEnglishName; } } diff --git a/Xbim.Ifc2x3/MeasureResource/IfcUnitExtensions.cs b/Xbim.Ifc2x3/MeasureResource/IfcUnitExtensions.cs index 9bbfb1166..519885c9a 100644 --- a/Xbim.Ifc2x3/MeasureResource/IfcUnitExtensions.cs +++ b/Xbim.Ifc2x3/MeasureResource/IfcUnitExtensions.cs @@ -9,12 +9,7 @@ public static class UnitExtensions /// string holding full name public static string Name(this IfcUnit ifcUnit) { - var unit = ifcUnit as IfcDerivedUnit; - if (unit != null) return unit.FullName; - var namedUnit = ifcUnit as IfcNamedUnit; - if (namedUnit != null) return namedUnit.FullName; - var monetaryUnit = ifcUnit as IfcMonetaryUnit; - return monetaryUnit != null ? monetaryUnit.FullEnglishName : string.Empty; + return Xbim.Ifc4.MeasureResource.UnitExtensions.Name(ifcUnit); } /// /// Get the symbol of the IfcUnit @@ -22,12 +17,7 @@ public static string Name(this IfcUnit ifcUnit) /// string holding symbol public static string Symbol(this IfcUnit ifcUnit) { - var unit = ifcUnit as IfcDerivedUnit; - if (unit != null) return unit.FullName; - var namedUnit = ifcUnit as IfcNamedUnit; - if (namedUnit != null) return namedUnit.Symbol; - var monetaryUnit = ifcUnit as IfcMonetaryUnit; - return monetaryUnit != null ? monetaryUnit.Symbol : string.Empty; + return Xbim.Ifc4.MeasureResource.UnitExtensions.Symbol(ifcUnit); } } diff --git a/Xbim.Ifc4/MeasureResource/IfcMonetaryUnitPartial.cs b/Xbim.Ifc4/MeasureResource/IfcMonetaryUnitPartial.cs index 7f49b53db..287b264f4 100644 --- a/Xbim.Ifc4/MeasureResource/IfcMonetaryUnitPartial.cs +++ b/Xbim.Ifc4/MeasureResource/IfcMonetaryUnitPartial.cs @@ -1,61 +1,42 @@ -using System.Globalization; -using System.Linq; + namespace Xbim.Ifc4.MeasureResource { public partial class IfcMonetaryUnit { /// - /// Get Symbol string for money unit + /// Gets the Symbol string for money unit /// /// String holding symbol public string Symbol { get { - //TODO resolve this, net standard and core do not support culture iteration and it is apparently very slow - //string value = CultureInfo.GetCultures(CultureTypes.SpecificCultures) - // .Where(c => new RegionInfo(c.LCID).ISOCurrencySymbol == Currency.ToString()) - // .Select(c => new RegionInfo(c.LCID).CurrencySymbol) - // .FirstOrDefault(); - //return string.IsNullOrEmpty(value) ? Currency.ToString() : value; - return Currency.ToString(); + return this.Symbol(); } } /// - ///Get full English name of the currency + /// Gets the name of the currency as its known internationally /// /// String as full name - public string FullEnglishName + public string FullEnglishName { get { - //TODO resolve this - //string value = CultureInfo.GetCultures(CultureTypes.SpecificCultures) - // .Where(c => new RegionInfo(c.LCID).ISOCurrencySymbol == Currency.ToString()) - // .Select(c => new RegionInfo(c.LCID).CurrencyEnglishName) - // .FirstOrDefault(); - //return string.IsNullOrEmpty(value) ? Currency.ToString() : value; - return Currency.ToString(); + return this.FullEnglishName(); } } /// - ///Get full Native name of the currency + /// Gets the name of the currency as its known natively /// /// String holding full name public string FullNativeName { get { - //TODO resolve this - //string value = CultureInfo.GetCultures(CultureTypes.SpecificCultures) - // .Where(c => new RegionInfo(c.LCID).ISOCurrencySymbol == Currency.ToString()) - // .Select(c => new RegionInfo(c.LCID).CurrencyNativeName) - // .FirstOrDefault(); - //return string.IsNullOrEmpty(value) ? Currency.ToString() : value; - return Currency.ToString(); + return this.FullNativeName(); } } @@ -63,7 +44,7 @@ public string FullName { get { - return FullNativeName; + return FullEnglishName; } } diff --git a/Xbim.Ifc4/MeasureResource/IfcUnitExtensions.cs b/Xbim.Ifc4/MeasureResource/IfcUnitExtensions.cs index 9fe2bdb7c..1b3432079 100644 --- a/Xbim.Ifc4/MeasureResource/IfcUnitExtensions.cs +++ b/Xbim.Ifc4/MeasureResource/IfcUnitExtensions.cs @@ -1,33 +1,104 @@ -namespace Xbim.Ifc4.MeasureResource +using System.Collections.Generic; +using System.Globalization; +using System; +using Xbim.Ifc4.Interfaces; +using System.Linq; + +namespace Xbim.Ifc4.MeasureResource { public static class UnitExtensions { + /// /// Get the full name of the IfcUnit /// /// string holding full name - public static string Name(this IfcUnit ifcUnit) + public static string Name(this IIfcUnit ifcUnit) { - var unit = ifcUnit as IfcDerivedUnit; - if (unit != null) return unit.FullName; - var namedUnit = ifcUnit as IfcNamedUnit; - if (namedUnit != null) return namedUnit.FullName; - var monetaryUnit = ifcUnit as IfcMonetaryUnit; - return monetaryUnit != null ? monetaryUnit.FullEnglishName : string.Empty; + return ifcUnit switch + { + IIfcDerivedUnit unit => unit.FullName, + IIfcNamedUnit namedUnit => namedUnit.FullName, + IIfcMonetaryUnit monetaryUnit => monetaryUnit.FullEnglishName(), + _ => string.Empty + }; } /// /// Get the symbol of the IfcUnit /// /// string holding symbol - public static string Symbol(this IfcUnit ifcUnit) + public static string Symbol(this IIfcUnit ifcUnit) + { + return ifcUnit switch + { + IIfcDerivedUnit unit => unit.FullName, + IIfcNamedUnit namedUnit => namedUnit.Symbol, + IIfcMonetaryUnit monetaryUnit => monetaryUnit.Symbol(), + _ => string.Empty + }; + } + + + /// + /// Gets the currency symbol (e.g. $, £, €, kr etc) for the + /// + /// + /// + public static string Symbol(this IIfcMonetaryUnit obj) + { + return CurrencyMap.ContainsKey(obj.Currency) ? CurrencyMap[obj.Currency].CurrencySymbol : obj.Currency.ToString(); + } + + /// + /// Gets the currency name in English for the + /// + /// + /// + public static string FullEnglishName(this IIfcMonetaryUnit obj) { - var unit = ifcUnit as IfcDerivedUnit; - if (unit != null) return unit.FullName; - var namedUnit = ifcUnit as IfcNamedUnit; - if (namedUnit != null) return namedUnit.Symbol; - var monetaryUnit = ifcUnit as IfcMonetaryUnit; - return monetaryUnit != null ? monetaryUnit.Symbol : string.Empty; + return CurrencyMap.ContainsKey(obj.Currency) ? CurrencyMap[obj.Currency].CurrencyEnglishName : obj.Currency.ToString(); + } + + /// + /// Gets the currency name in local culture for the + /// + /// Note: this is imprecise and inherently ambiguous due to different cultures installed, but for example + /// Polish PLN might be known natively as 'złoty polski' rather than 'Polish Zloty' + /// + /// + public static string FullNativeName(this IIfcMonetaryUnit obj) + { + return CurrencyMap.ContainsKey(obj.Currency) ? CurrencyMap[obj.Currency].CurrencyNativeName : obj.Currency.ToString(); + } + private static IDictionary CurrencyMap => LazyCurrencyMap.Value; + + + // Lazily constructed dictionary of 'Regioninfo' by ISO Currency codes, acquired from all installed specific cultures. + // eg. en-GB => {GBP}, en-US => {USD}, fr-FR => {Euro} etc. This mapping is slightly imperfect in terms of + // Cultural labling but good enough? See below + private static Lazy> LazyCurrencyMap = new Lazy>(() => + CultureInfo.GetCultures(CultureTypes.SpecificCultures) + .Where(c => !skippedCountryCodes.Any(i => c.Name == i)) + .Select(c => new RegionInfo(c.LCID)) + .Distinct(new RegionInfoComparer()) + .ToDictionary(r => r.ISOCurrencySymbol, r => r)); + + // We're acquiring currency symbols and localised names etc indirectly from all installed cultures on the platform. + // But the first culture we locate a currency in may not be the most natural/prevalent. E.g. Locating GBP on Windows, + // 'cy-GB' (Welsh UK) comes before 'en-GB' (English UK), based on the order of cultures, meaning the GBP + // CurrencyNativeName appears as 'Punt Prydain' rather than the more natural 'Pound Sterling'. + // + // Note: There are probably many other countries where a currency is shared across cultures and the first culture + // is not the most natural one. (e.g INR, ZAR), so this list may need updating + // This only affects currency lookups, not any other Culture/Locale feature. + private static string[] skippedCountryCodes = new[] { "cy-GB", "gd-GB" }; + + private class RegionInfoComparer : IEqualityComparer + { + public bool Equals(RegionInfo x, RegionInfo y) => x.ISOCurrencySymbol == y.ISOCurrencySymbol; + + public int GetHashCode(RegionInfo obj) => obj.ISOCurrencySymbol.GetHashCode(); } } diff --git a/Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSetPartial.cs b/Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSet.Partial.cs similarity index 100% rename from Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSetPartial.cs rename to Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSet.Partial.cs diff --git a/Xbim.Ifc4x3/MeasureResource/IfcCompoundPlaneAngleMeasure.Partial.cs b/Xbim.Ifc4x3/MeasureResource/IfcCompoundPlaneAngleMeasure.Partial.cs new file mode 100644 index 000000000..4d205ce6d --- /dev/null +++ b/Xbim.Ifc4x3/MeasureResource/IfcCompoundPlaneAngleMeasure.Partial.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Xbim.Ifc4x3.MeasureResource +{ + public partial struct IfcCompoundPlaneAngleMeasure : IEnumerable + { + public double AsDouble + { + get + { + var components = _value.Count; + double measure1 = 0; double measure2 = 0; double measure3 = 0; double millionthsOfaSecond = 0; + if (components > 3) millionthsOfaSecond = _value[3]; + if (components > 2) measure3 = _value[2]; + if (components > 1) measure2 = _value[1]; + if (components > 0) measure1 = _value[0]; + double main = measure1 + (measure2 / 60.0) + (measure3 / 3600.0) + (millionthsOfaSecond / 3600e6); + return main; + } + } + + public static IfcCompoundPlaneAngleMeasure FromDouble(double degreeAngle) + { + int measure1; int measure2; int measure3; int measure4; + measure1 = (int)degreeAngle; //integer part + measure2 = (int)((degreeAngle - measure1) * 60); + measure3 = (int)((((degreeAngle - measure1) * 60) - measure2) * 60); + measure4 = (int)((((((degreeAngle - measure1) * 60) - measure2) * 60) - measure3) * 1e6); + var vals = new List() { measure1, measure2, measure3, measure4 }; + return new IfcCompoundPlaneAngleMeasure(vals); + } + + public IEnumerator GetEnumerator() + { + return _value.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/Xbim.Ifc4x3/MeasureResource/IfcConversionBasedUnit.Partial.cs b/Xbim.Ifc4x3/MeasureResource/IfcConversionBasedUnit.Partial.cs new file mode 100644 index 000000000..5aa7bff3c --- /dev/null +++ b/Xbim.Ifc4x3/MeasureResource/IfcConversionBasedUnit.Partial.cs @@ -0,0 +1,42 @@ +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc4x3.MeasureResource +{ + public partial class IfcConversionBasedUnit + { + public override string FullName { get { return Name; } } + + /// + /// Get Symbol string for IfcConversionBasedUnit conversion unit + /// + /// String holding symbol + public new string Symbol + { + get + { + string name = Name; + + if ((UnitType == IfcUnitEnum.LENGTHUNIT) || + (UnitType == IfcUnitEnum.AREAUNIT) || + (UnitType == IfcUnitEnum.VOLUMEUNIT) + ) + { + string pow = string.Empty; + if (Dimensions.LengthExponent == 2) //area + pow += '\u00B2'; //try unicode ((char)0x00B2)add ² + if (Dimensions.LengthExponent == 3) //volume + pow += '\u00B3'; //((char)0x00B3)add ³ + + if ((name.ToUpper().Contains("FEET")) || (name.ToUpper().Contains("FOOT"))) + return "ft" + pow; + + if (name.ToUpper().Contains("INCH")) + return "in" + pow; + + return name + pow; + } + return name; + } + } + } +} From 120d8ca01afe6c37e83a06f9dd539f9fdff48162 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Thu, 27 Feb 2025 15:04:11 +0000 Subject: [PATCH 05/16] WIP Unit assignment refactoring --- Tests/Ifc4x3ExtensionsTests.cs | 92 +++++ .../IIfcUnitAssignmentExtensions.cs | 367 ++++++++++++++++++ 2 files changed, 459 insertions(+) create mode 100644 Xbim.Ifc/Extensions/IIfcUnitAssignmentExtensions.cs diff --git a/Tests/Ifc4x3ExtensionsTests.cs b/Tests/Ifc4x3ExtensionsTests.cs index 403defa06..e5a29fa2d 100644 --- a/Tests/Ifc4x3ExtensionsTests.cs +++ b/Tests/Ifc4x3ExtensionsTests.cs @@ -290,6 +290,98 @@ public void CanReadMonetaryUnit(string tla, string expectedSymbol, string expect currency.FullNativeName().Should().Be(nativeName); } + [Fact] + public void CanGetUnitForProperty() + { + XbimCommonSchema.Interfaces.IIfcProject project = Model.Instances.New(); + project.Initialize(ProjectUnits.SIUnitsUK); + + var prop = Model.Instances.New(p => + { + p.Name = "Volume"; + p.NominalValue = new Ifc4x3.MeasureResource.IfcVolumeMeasure(123d); + }); + + XbimCommonSchema.Interfaces.IIfcNamedUnit unit = project.UnitsInContext.GetUnitFor(prop); + + unit.Should().NotBeNull(); + unit.FullName.Should().Be("CUBICMETRE"); + } + + [Fact] + public void CanGetUnitForPropertyWhenOverridden() + { + XbimCommonSchema.Interfaces.IIfcProject project = Model.Instances.New(); + project.Initialize(ProjectUnits.SIUnitsUK); + var modelunit = project.UnitsInContext.Units.OfType().FirstOrDefault(u => u.UnitType == Ifc4x3.MeasureResource.IfcUnitEnum.LENGTHUNIT); + + var prop = Model.Instances.New(p => + { + p.Name = "Length"; + p.NominalValue = new Ifc4x3.MeasureResource.IfcReal(123d); + p.Unit = modelunit; + }); + + XbimCommonSchema.Interfaces.IIfcNamedUnit unit = project.UnitsInContext.GetUnitFor(prop); + + unit.Should().NotBeNull(); + unit.FullName.Should().Be("MILLIMETRE"); + } + + [Fact] + public void CanGetUnitForQuantity() + { + XbimCommonSchema.Interfaces.IIfcProject project = Model.Instances.New(); + project.Initialize(ProjectUnits.SIUnitsUK); + + var quant = Model.Instances.New(qa => + { + qa.Name = "GrossArea"; + qa.TimeValue = 1.5; + }); + + XbimCommonSchema.Interfaces.IIfcNamedUnit unit = project.UnitsInContext.GetUnitFor(quant); + unit.Should().NotBeNull(); + unit.FullName.Should().Be("SECOND"); + } + + [InlineData(XbimCommonSchema.Interfaces.IfcUnitEnum.LENGTHUNIT, "MILLIMETRE")] + [InlineData(XbimCommonSchema.Interfaces.IfcUnitEnum.AREAUNIT, "SQUAREMETRE")] + [InlineData(XbimCommonSchema.Interfaces.IfcUnitEnum.VOLUMEUNIT, "CUBICMETRE")] + [InlineData(XbimCommonSchema.Interfaces.IfcUnitEnum.MASSUNIT, "GRAM")] // Inconsistent - is kg in Ifc2x3/4 + [InlineData(XbimCommonSchema.Interfaces.IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT, "DEGREECELSIUS")] + [Theory] + public void CanGetUnits(XbimCommonSchema.Interfaces.IfcUnitEnum unitType, string expectedUnitName) + { + XbimCommonSchema.Interfaces.IIfcProject project = Model.Instances.New(); + project.Initialize(ProjectUnits.SIUnitsUK); + + XbimCommonSchema.Interfaces.IIfcNamedUnit result = project.UnitsInContext.GetUnitFor(unitType); + result.Should().NotBeNull(); + result.UnitType.Should().Be(unitType); + result.Name().Should().Be(expectedUnitName); + } + + [Fact] + public void CanChangeUnits() + { + XbimCommonSchema.Interfaces.IIfcProject project = Model.Instances.New(); + project.Initialize(ProjectUnits.SIUnitsUK); + + project.UnitsInContext.SetOrChangeConversionUnit(XbimCommonSchema.Interfaces.IfcUnitEnum.LENGTHUNIT, ConversionBasedUnit.Inch); + + var unit = project.UnitsInContext.GetUnitFor(XbimCommonSchema.Interfaces.IfcUnitEnum.LENGTHUNIT); + + unit.Should().NotBeNull(); + unit.Name().Should().Be("inch"); + unit.Should().BeOfType(); + + var cbt = (Ifc4x3.MeasureResource.IfcConversionBasedUnit)unit; + cbt.ConversionFactor.ValueComponent.Value.Should().Be(25.4d); + cbt.ConversionFactor.UnitComponent.FullName.Should().Be("MILLIMETRE"); + + } + #region Dispose private bool disposedValue; diff --git a/Xbim.Ifc/Extensions/IIfcUnitAssignmentExtensions.cs b/Xbim.Ifc/Extensions/IIfcUnitAssignmentExtensions.cs new file mode 100644 index 000000000..561e8387a --- /dev/null +++ b/Xbim.Ifc/Extensions/IIfcUnitAssignmentExtensions.cs @@ -0,0 +1,367 @@ +using System; +using System.Linq; +using Xbim.Common; +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc +{ + public enum ConversionBasedUnit + { + Inch, + Foot, + Yard, + Mile, + Acre, + Litre, + PintUk, + PintUs, + GallonUk, + GallonUs, + Ounce, + Pound, + SquareFoot, + CubicFoot + } + public static class IIfcUnitAssignmentExtensions + { + public static double Power(this IIfcUnitAssignment obj, IfcUnitEnum unitType) + { + var siUnit = obj.Units.OfType().FirstOrDefault(u => u.UnitType == unitType); + if (siUnit != null && siUnit.Prefix.HasValue) + return siUnit.Power; + var conversionUnit = + obj.Units.OfType().FirstOrDefault(u => u.UnitType == unitType); + if (conversionUnit == null) return 1.0; + var measureUnit = conversionUnit.ConversionFactor; + var uc = measureUnit.UnitComponent as IIfcSIUnit; + //some BIM tools such as StruCAD write the conversion value out as a Length Measure + if (uc == null) return 1.0; + + + var et = ((IExpressValueType)measureUnit.ValueComponent); + var cFactor = 1.0; + if (et.UnderlyingSystemType == typeof(double)) + cFactor = (double)et.Value; + else if (et.UnderlyingSystemType == typeof(int)) + cFactor = (int)et.Value; + else if (et.UnderlyingSystemType == typeof(long)) + cFactor = (long)et.Value; + + return uc.Power * cFactor; + } + + /// + /// Sets the Length Unit to be SIUnit and SIPrefix, returns false if the units are not SI + /// + /// + /// + /// + /// + public static bool SetSiLengthUnits(this IIfcUnitAssignment obj, IfcSIUnitName siUnitName, IfcSIPrefix? siPrefix) + { + var si = obj.Units.OfType().FirstOrDefault(u => u.UnitType == IfcUnitEnum.LENGTHUNIT); + if (si != null) + { + si.Prefix = siPrefix; + si.Name = siUnitName; + return true; + } + return false; + } + + public static void SetOrChangeSiUnit(this IIfcUnitAssignment obj, IfcUnitEnum unitType, IfcSIUnitName siUnitName, + IfcSIPrefix? siUnitPrefix) + { + var model = obj.Model; + var si = obj.Units.OfType().FirstOrDefault(u => u.UnitType == unitType); + if (si != null) + { + si.Prefix = siUnitPrefix; + si.Name = siUnitName; + } + else + { + var factory = new EntityCreator(model); + obj.Units.Add(factory.SIUnit(s => + { + s.UnitType = unitType; + s.Name = siUnitName; + s.Prefix = siUnitPrefix; + })); + } + } + + /// + /// Gets the unit for a + /// + /// + /// + /// + public static IIfcNamedUnit GetUnitFor(this IIfcUnitAssignment obj, IIfcPropertySingleValue property) + { + + if (property.Unit != null) + return (IIfcNamedUnit)property.Unit; + + // nominal value can be of types with subtypes: + // IfcMeasureValue, IfcSimpleValue, IfcDerivedMeasureValue + + IfcUnitEnum? requiredUnit = property.NominalValue switch + { + Ifc4.MeasureResource.IfcVolumeMeasure => (IfcUnitEnum?)IfcUnitEnum.VOLUMEUNIT, + Ifc4.MeasureResource.IfcAreaMeasure => (IfcUnitEnum?)IfcUnitEnum.AREAUNIT, + Ifc4.MeasureResource.IfcLengthMeasure => (IfcUnitEnum?)IfcUnitEnum.LENGTHUNIT, + Ifc4.MeasureResource.IfcPositiveLengthMeasure => (IfcUnitEnum?)IfcUnitEnum.LENGTHUNIT, + Ifc4.MeasureResource.IfcNonNegativeLengthMeasure => (IfcUnitEnum?)IfcUnitEnum.LENGTHUNIT, + Ifc4.MeasureResource.IfcAmountOfSubstanceMeasure => (IfcUnitEnum?)IfcUnitEnum.AMOUNTOFSUBSTANCEUNIT, + Ifc4.MeasureResource.IfcElectricCurrentMeasure => (IfcUnitEnum?)IfcUnitEnum.ELECTRICCURRENTUNIT, + Ifc4.MeasureResource.IfcLuminousIntensityMeasure => (IfcUnitEnum?)IfcUnitEnum.LUMINOUSINTENSITYUNIT, + Ifc4.MeasureResource.IfcMassMeasure => (IfcUnitEnum?)IfcUnitEnum.MASSUNIT, + Ifc4.MeasureResource.IfcPlaneAngleMeasure => (IfcUnitEnum?)IfcUnitEnum.PLANEANGLEUNIT, + Ifc4.MeasureResource.IfcPositivePlaneAngleMeasure => (IfcUnitEnum?)IfcUnitEnum.PLANEANGLEUNIT, + Ifc4.MeasureResource.IfcThermodynamicTemperatureMeasure => (IfcUnitEnum?)IfcUnitEnum.THERMODYNAMICTEMPERATUREUNIT, + Ifc4.MeasureResource.IfcSolidAngleMeasure => (IfcUnitEnum?)IfcUnitEnum.SOLIDANGLEUNIT, + Ifc4.MeasureResource.IfcTimeMeasure => (IfcUnitEnum?)IfcUnitEnum.TIMEUNIT, + + Ifc4.MeasureResource.IfcContextDependentMeasure => null,// todo: not sure what to do here + Ifc4.MeasureResource.IfcCountMeasure => null,// todo: not sure what to do here + Ifc4.MeasureResource.IfcDescriptiveMeasure => null,// todo: not sure what to do here + Ifc4.MeasureResource.IfcNormalisedRatioMeasure => null,// todo: not sure what to do here + Ifc4.MeasureResource.IfcNumericMeasure => null,// todo: not sure what to do here. + Ifc4.MeasureResource.IfcParameterValue => null,// todo: not sure what to do here. + Ifc4.MeasureResource.IfcPositiveRatioMeasure => null,// todo: not sure what to do here. + Ifc4.MeasureResource.IfcRatioMeasure => null,// todo: not sure what to do here. + Ifc4.MeasureResource.IfcComplexNumber => null,// todo: not sure what to do here. + // types from IfcSimpleValue + Ifc4.MeasureResource.IfcSimpleValue => null, + _ => null, + }; + // more measures types to be taken from http://www.buildingsmart-tech.org/ifc/IFC2x3/TC1/html/ifcmeasureresource/lexical/ifcderivedmeasurevalue.htm + + if (requiredUnit == null) + return null; + + IIfcNamedUnit nu = obj.Units.OfType().FirstOrDefault(u => u.UnitType == (IfcUnitEnum)requiredUnit) ?? + (IIfcNamedUnit)obj.Units.OfType().FirstOrDefault(u => u.UnitType == (IfcUnitEnum)requiredUnit); + return nu; + } + + /// + /// Gets the unit for a + /// + /// + /// + /// + public static IIfcNamedUnit GetUnitFor(this IIfcUnitAssignment obj, IIfcPhysicalSimpleQuantity quantity) + { + if (quantity.Unit != null) + return quantity.Unit; + + //IfcUnitEnum? requiredUnit = null; + + // list of possible types taken from: + // http://www.buildingsmart-tech.org/ifc/IFC2x3/TC1/html/ifcquantityresource/lexical/ifcphysicalsimplequantity.htm + // + IfcUnitEnum? requiredUnit = quantity switch + { + Ifc2x3.QuantityResource.IfcQuantityLength => IfcUnitEnum.LENGTHUNIT, + Ifc2x3.QuantityResource.IfcQuantityArea => IfcUnitEnum.AREAUNIT, + Ifc2x3.QuantityResource.IfcQuantityVolume => IfcUnitEnum.VOLUMEUNIT, + Ifc2x3.QuantityResource.IfcQuantityCount => null, + Ifc2x3.QuantityResource.IfcQuantityWeight => IfcUnitEnum.MASSUNIT, + Ifc2x3.QuantityResource.IfcQuantityTime => IfcUnitEnum.TIMEUNIT, + + Ifc4.QuantityResource.IfcQuantityLength => IfcUnitEnum.LENGTHUNIT, + Ifc4.QuantityResource.IfcQuantityArea => IfcUnitEnum.AREAUNIT, + Ifc4.QuantityResource.IfcQuantityVolume => IfcUnitEnum.VOLUMEUNIT, + Ifc4.QuantityResource.IfcQuantityCount => null, + Ifc4.QuantityResource.IfcQuantityWeight => IfcUnitEnum.MASSUNIT, + Ifc4.QuantityResource.IfcQuantityTime => IfcUnitEnum.TIMEUNIT, + + Ifc4x3.QuantityResource.IfcQuantityLength => IfcUnitEnum.LENGTHUNIT, + Ifc4x3.QuantityResource.IfcQuantityArea => IfcUnitEnum.AREAUNIT, + Ifc4x3.QuantityResource.IfcQuantityVolume => IfcUnitEnum.VOLUMEUNIT, + Ifc4x3.QuantityResource.IfcQuantityCount => null, + Ifc4x3.QuantityResource.IfcQuantityNumber => null, + Ifc4x3.QuantityResource.IfcQuantityWeight => IfcUnitEnum.MASSUNIT, + Ifc4x3.QuantityResource.IfcQuantityTime => IfcUnitEnum.TIMEUNIT, + _ => null, + }; + + if (requiredUnit == null) + return null; + + IIfcNamedUnit nu = obj.Units.OfType().FirstOrDefault(u => u.UnitType == (IfcUnitEnum)requiredUnit) ?? + (IIfcNamedUnit)obj.Units.OfType().FirstOrDefault(u => u.UnitType == (IfcUnitEnum)requiredUnit); + return nu; + } + + /// + /// Gets the unit for an + /// + /// + /// + /// + public static IIfcNamedUnit GetUnitFor(this IIfcUnitAssignment obj, IfcUnitEnum unitType) + { + return obj.Units.OfType().FirstOrDefault(u => u.UnitType == unitType) ?? + (IIfcNamedUnit)obj.Units.OfType().FirstOrDefault(u => u.UnitType == unitType); + } + + public static void SetOrChangeConversionUnit(this IIfcUnitAssignment obj, IfcUnitEnum unitType, ConversionBasedUnit unit) + { + + var si = obj.Units.OfType().FirstOrDefault(u => u.UnitType == unitType); + if (si != null) + { + obj.Units.Remove(si); + try + { + obj.Model.Delete(si); + } + catch (Exception) + { + // ignored + } + } + obj.Units.Add(GetNewConversionUnit(obj.Model, unitType, unit)); + } + + private static IIfcConversionBasedUnit GetNewConversionUnit(IModel model, IfcUnitEnum unitType, ConversionBasedUnit unitEnum) + { + var factory = new EntityCreator(model); + var unit = factory.ConversionBasedUnit(); + unit.UnitType = unitType; + + switch (unitEnum) + { + case ConversionBasedUnit.Inch: + SetConversionUnitsParameters(model, unit, "inch", 25.4, IfcUnitEnum.LENGTHUNIT, IfcSIUnitName.METRE, + IfcSIPrefix.MILLI, GetLengthDimension(factory)); + break; + case ConversionBasedUnit.Foot: + SetConversionUnitsParameters(model, unit, "foot", 304.8, IfcUnitEnum.LENGTHUNIT, IfcSIUnitName.METRE, + IfcSIPrefix.MILLI, GetLengthDimension(factory)); + break; + case ConversionBasedUnit.Yard: + SetConversionUnitsParameters(model, unit, "yard", 914, IfcUnitEnum.LENGTHUNIT, IfcSIUnitName.METRE, + IfcSIPrefix.MILLI, GetLengthDimension(factory)); + break; + case ConversionBasedUnit.Mile: + SetConversionUnitsParameters(model, unit, "mile", 1609, IfcUnitEnum.LENGTHUNIT, IfcSIUnitName.METRE, + null, GetLengthDimension(factory)); + break; + case ConversionBasedUnit.Acre: + SetConversionUnitsParameters(model, unit, "acre", 4046.86, IfcUnitEnum.AREAUNIT, + IfcSIUnitName.SQUARE_METRE, null, GetAreaDimension(factory)); + break; + case ConversionBasedUnit.Litre: + SetConversionUnitsParameters(model, unit, "litre", 0.001, IfcUnitEnum.VOLUMEUNIT, + IfcSIUnitName.CUBIC_METRE, null, GetVolumeDimension(factory)); + break; + case ConversionBasedUnit.PintUk: + SetConversionUnitsParameters(model, unit, "pint UK", 0.000568, IfcUnitEnum.VOLUMEUNIT, + IfcSIUnitName.CUBIC_METRE, null, GetVolumeDimension(factory)); + break; + case ConversionBasedUnit.PintUs: + SetConversionUnitsParameters(model, unit, "pint US", 0.000473, IfcUnitEnum.VOLUMEUNIT, + IfcSIUnitName.CUBIC_METRE, null, GetVolumeDimension(factory)); + break; + case ConversionBasedUnit.GallonUk: + SetConversionUnitsParameters(model, unit, "gallon UK", 0.004546, IfcUnitEnum.VOLUMEUNIT, + IfcSIUnitName.CUBIC_METRE, null, GetVolumeDimension(factory)); + break; + case ConversionBasedUnit.GallonUs: + SetConversionUnitsParameters(model, unit, "gallon US", 0.003785, IfcUnitEnum.VOLUMEUNIT, + IfcSIUnitName.CUBIC_METRE, null, GetVolumeDimension(factory)); + break; + case ConversionBasedUnit.Ounce: + SetConversionUnitsParameters(model, unit, "ounce", 28.35, IfcUnitEnum.MASSUNIT, IfcSIUnitName.GRAM, + null, GetMassDimension(factory)); + break; + case ConversionBasedUnit.Pound: + SetConversionUnitsParameters(model, unit, "pound", 0.454, IfcUnitEnum.MASSUNIT, IfcSIUnitName.GRAM, + IfcSIPrefix.KILO, GetMassDimension(factory)); + break; + case ConversionBasedUnit.SquareFoot: + SetConversionUnitsParameters(model, unit, "square foot", 92903.04, IfcUnitEnum.AREAUNIT, IfcSIUnitName.METRE, + IfcSIPrefix.MILLI, GetAreaDimension(factory)); + break; + case ConversionBasedUnit.CubicFoot: + SetConversionUnitsParameters(model, unit, "cubic foot", 28316846.6, IfcUnitEnum.VOLUMEUNIT, IfcSIUnitName.METRE, + IfcSIPrefix.MILLI, GetVolumeDimension(factory)); + break; + } + + return unit; + } + private static void SetConversionUnitsParameters(IModel model, IIfcConversionBasedUnit unit, Ifc4.MeasureResource.IfcLabel name, + Ifc4.MeasureResource.IfcRatioMeasure ratio, IfcUnitEnum unitType, IfcSIUnitName siUnitName, + IfcSIPrefix? siUnitPrefix, IIfcDimensionalExponents dimensions) + { + var factory = new EntityCreator(model); + unit.Name = name; + unit.ConversionFactor = factory.MeasureWithUnit(); + unit.ConversionFactor.ValueComponent = ratio; + unit.ConversionFactor.UnitComponent = factory.SIUnit(s => + { + s.UnitType = unitType; + s.Name = siUnitName; + s.Prefix = siUnitPrefix; + }); + unit.Dimensions = dimensions; + } + private static IIfcDimensionalExponents GetLengthDimension(EntityCreator factory) + { + var dimension = factory.DimensionalExponents(); + dimension.AmountOfSubstanceExponent = 0; + dimension.ElectricCurrentExponent = 0; + dimension.LengthExponent = 1; + dimension.LuminousIntensityExponent = 0; + dimension.MassExponent = 0; + dimension.ThermodynamicTemperatureExponent = 0; + dimension.TimeExponent = 0; + + return dimension; + } + private static IIfcDimensionalExponents GetVolumeDimension(EntityCreator factory) + { + var dimension = factory.DimensionalExponents(); + dimension.AmountOfSubstanceExponent = 0; + dimension.ElectricCurrentExponent = 0; + dimension.LengthExponent = 3; + dimension.LuminousIntensityExponent = 0; + dimension.MassExponent = 0; + dimension.ThermodynamicTemperatureExponent = 0; + dimension.TimeExponent = 0; + + return dimension; + } + private static IIfcDimensionalExponents GetAreaDimension(EntityCreator factory) + { + var dimension = factory.DimensionalExponents(); + dimension.AmountOfSubstanceExponent = 0; + dimension.ElectricCurrentExponent = 0; + dimension.LengthExponent = 2; + dimension.LuminousIntensityExponent = 0; + dimension.MassExponent = 0; + dimension.ThermodynamicTemperatureExponent = 0; + dimension.TimeExponent = 0; + + return dimension; + } + private static IIfcDimensionalExponents GetMassDimension(EntityCreator factory) + { + var dimension = factory.DimensionalExponents(); + dimension.AmountOfSubstanceExponent = 0; + dimension.ElectricCurrentExponent = 0; + dimension.LengthExponent = 0; + dimension.LuminousIntensityExponent = 0; + dimension.MassExponent = 1; + dimension.ThermodynamicTemperatureExponent = 0; + dimension.TimeExponent = 0; + + return dimension; + } + } +} From d86676a365d292b67b2c67da07d63696fd625401 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Wed, 5 Mar 2025 10:26:50 +0000 Subject: [PATCH 06/16] Added IFC4 mapping support for IfcCoordinateReferenceSystem.VerticalDatum --- Tests/Ifc4x3Tests.cs | 32 +++++++++++ .../IFC4/IfcCoordinateReferenceSystem.cs | 53 +++++++++++-------- 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/Tests/Ifc4x3Tests.cs b/Tests/Ifc4x3Tests.cs index 1c310e5f8..37025da6a 100644 --- a/Tests/Ifc4x3Tests.cs +++ b/Tests/Ifc4x3Tests.cs @@ -12,6 +12,7 @@ using Xbim.Ifc4x3.GeometryResource; using Xbim.Ifc4x3.MeasureResource; using Xbim.Ifc4x3.ProductExtension; +using Xbim.Ifc4x3.RepresentationResource; using Xbim.IO.Memory; namespace Xbim.Essentials.Tests @@ -188,5 +189,36 @@ public void IfcLengthMeasureSubClassesCanUsed() } + [TestMethod] + public void IfcCoordinateReferenceSystemVerticalDatumCanAccessViaIfc4() + { + using var model = new MemoryModel(new EntityFactoryIfc4x3Add2()); + using var txn = model.BeginTransaction("Creation"); + + var projectedCoords = model.Instances.New(o => o.VerticalDatum="EPSG:5555"); + + IIfcCoordinateReferenceSystem ifc4Coords = projectedCoords; + + ifc4Coords.VerticalDatum.Value.Value.Should().Be("EPSG:5555"); + ifc4Coords.VerticalDatum = "Test"; + projectedCoords.VerticalDatum.Value.Value.Should().Be("Test"); + + } + + [TestMethod] + public void IfcCoordinateReferenceSystemVerticalDatumCanReadAndSetNull() + { + using var model = new MemoryModel(new EntityFactoryIfc4x3Add2()); + using var txn = model.BeginTransaction("Creation"); + + + var projectedCoords = model.Instances.New(o => o.VerticalDatum = null); + IIfcCoordinateReferenceSystem ifc4Coords = projectedCoords; + ifc4Coords.VerticalDatum.HasValue.Should().BeFalse(); + + ifc4Coords.VerticalDatum = null; + projectedCoords.VerticalDatum.HasValue.Should().BeFalse(); + } + } } diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoordinateReferenceSystem.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoordinateReferenceSystem.cs index 4cc59a518..d3b1f00b1 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoordinateReferenceSystem.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoordinateReferenceSystem.cs @@ -71,26 +71,7 @@ Ifc4.MeasureResource.IfcLabel IIfcCoordinateReferenceSystem.Name } } - [CrossSchemaAttribute(typeof(IIfcCoordinateReferenceSystem), 4)] - Ifc4.MeasureResource.IfcIdentifier? IIfcCoordinateReferenceSystem.VerticalDatum - { - get - { - //## Handle return of VerticalDatum for which no match was found - //TODO: Handle return of VerticalDatum for which no match was found - throw new System.NotImplementedException(); - //## - } - set - { - //## Handle setting of VerticalDatum for which no match was found - //TODO: Handle setting of VerticalDatum for which no match was found - throw new System.NotImplementedException(); - //## - NotifyPropertyChanged("VerticalDatum"); - - } - } + IEnumerable IIfcCoordinateReferenceSystem.HasCoordinateOperation { get @@ -98,7 +79,33 @@ IEnumerable IIfcCoordinateReferenceSystem.HasCoordinate return Model.Instances.Where(e => (e.SourceCRS as IfcCoordinateReferenceSystem) == this, "SourceCRS", this); } } - //## Custom code - //## - } + //## Custom code + + // IfcCoordinateReferenceSystem was made abstract in 4x3. VerticalDatum has been promoted to IfcProjectedCRS + // Will be null for IfcGeographicCRS + [CrossSchemaAttribute(typeof(IIfcCoordinateReferenceSystem), 4)] + Ifc4.MeasureResource.IfcIdentifier? IIfcCoordinateReferenceSystem.VerticalDatum + { + get + { + if (this is IfcProjectedCRS projected && projected.VerticalDatum.HasValue) + { + return new Ifc4.MeasureResource.IfcIdentifier(projected.VerticalDatum.ToString()); + } + return null; + } + set + { + if (this is IfcProjectedCRS projected) + { + if (value != null) + { + projected.VerticalDatum = value.ToString(); + NotifyPropertyChanged("VerticalDatum"); + } + } + } + } + //## + } } \ No newline at end of file From 4aa855a9182d6c7ede36863b16369595d881ef4e Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Thu, 6 Mar 2025 10:12:17 +0000 Subject: [PATCH 07/16] Implement missing PredefinedType maps for IFC4x3 For future maintenance, rather than hardwire the UNDEFINED literal this uses a helper to return USERDEFINED to the 'common' schema when using enums new in 4x3 --- Tests/Ifc4x3Tests.cs | 29 +++++ Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarm.cs | 14 +-- Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarmType.cs | 16 ++- .../Interfaces/IFC4/IfcAppliedValue.cs | 3 +- .../IFC4/IfcAudioVisualAppliance.cs | 18 ++- .../IFC4/IfcAudioVisualApplianceType.cs | 14 +-- Xbim.Ifc4x3/Interfaces/IFC4/IfcBeam.cs | 54 ++++----- Xbim.Ifc4x3/Interfaces/IFC4/IfcBeamType.cs | 54 ++++----- .../Interfaces/IFC4/IfcBuildingElementPart.cs | 23 ++-- .../IFC4/IfcBuildingElementPartType.cs | 27 ++--- .../Interfaces/IFC4/IfcCableCarrierFitting.cs | 27 ++--- .../IFC4/IfcCableCarrierFittingType.cs | 27 ++--- .../Interfaces/IFC4/IfcCableCarrierSegment.cs | 27 ++--- .../IFC4/IfcCableCarrierSegmentType.cs | 27 ++--- .../Interfaces/IFC4/IfcCableFitting.cs | 9 +- .../Interfaces/IFC4/IfcCableFittingType.cs | 9 +- .../Interfaces/IFC4/IfcCableSegment.cs | 54 ++++----- .../Interfaces/IFC4/IfcCableSegmentType.cs | 54 ++++----- Xbim.Ifc4x3/Interfaces/IFC4/IfcColumn.cs | 27 ++--- Xbim.Ifc4x3/Interfaces/IFC4/IfcColumnType.cs | 27 ++--- .../IFC4/IfcCommunicationsAppliance.cs | 108 ++++++++---------- .../IFC4/IfcCommunicationsApplianceType.cs | 108 ++++++++---------- Xbim.Ifc4x3/Interfaces/IFC4/IfcCovering.cs | 12 +- .../Interfaces/IFC4/IfcCoveringType.cs | 6 +- .../Interfaces/IFC4/IfcDiscreteAccessory.cs | 54 +++------ .../IFC4/IfcDiscreteAccessoryType.cs | 54 +++------ .../Interfaces/IFC4/IfcDistributionPort.cs | 66 +++++------ .../Interfaces/IFC4/IfcDistributionSystem.cs | 21 ++-- Xbim.Ifc4x3/Interfaces/IFC4/IfcDoor.cs | 51 ++++----- Xbim.Ifc4x3/Interfaces/IFC4/IfcDoorType.cs | 51 ++++----- .../IFC4/IfcElectricFlowStorageDevice.cs | 12 +- .../IFC4/IfcElectricFlowStorageDeviceType.cs | 12 +- .../Interfaces/IFC4/IfcElementAssembly.cs | 57 +++------ .../Interfaces/IFC4/IfcElementAssemblyType.cs | 57 +++------ .../IFC4/IfcFireSuppressionTerminal.cs | 3 +- .../IFC4/IfcFireSuppressionTerminalType.cs | 3 +- .../Interfaces/IFC4/IfcFlowInstrument.cs | 6 +- .../Interfaces/IFC4/IfcFlowInstrumentType.cs | 6 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcFurniture.cs | 3 +- .../Interfaces/IFC4/IfcFurnitureType.cs | 3 +- .../Interfaces/IFC4/IfcGeographicElement.cs | 6 +- .../IFC4/IfcGeographicElementType.cs | 6 +- .../Interfaces/IFC4/IfcHeatExchanger.cs | 3 +- .../Interfaces/IFC4/IfcHeatExchangerType.cs | 3 +- .../Interfaces/IFC4/IfcMechanicalFastener.cs | 15 +-- .../IFC4/IfcMechanicalFastenerType.cs | 15 +-- Xbim.Ifc4x3/Interfaces/IFC4/IfcMember.cs | 21 ++-- Xbim.Ifc4x3/Interfaces/IFC4/IfcMemberType.cs | 21 ++-- Xbim.Ifc4x3/Interfaces/IFC4/IfcPlate.cs | 21 ++-- Xbim.Ifc4x3/Interfaces/IFC4/IfcPlateType.cs | 21 ++-- .../Interfaces/IFC4/IfcProjectionElement.cs | 6 +- .../Interfaces/IFC4/IfcProtectiveDevice.cs | 9 +- .../IFC4/IfcProtectiveDeviceType.cs | 9 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcRailing.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcRailingType.cs | 3 +- .../Interfaces/IFC4/IfcReinforcingBar.cs | 3 +- .../Interfaces/IFC4/IfcReinforcingBarType.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcSensor.cs | 24 ++-- Xbim.Ifc4x3/Interfaces/IFC4/IfcSensorType.cs | 24 ++-- Xbim.Ifc4x3/Interfaces/IFC4/IfcSlab.cs | 15 +-- Xbim.Ifc4x3/Interfaces/IFC4/IfcSlabType.cs | 15 +-- Xbim.Ifc4x3/Interfaces/IFC4/IfcSpace.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcSpaceType.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZone.cs | 6 +- .../Interfaces/IFC4/IfcSpatialZoneType.cs | 6 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcStair.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcStairType.cs | 3 +- .../Interfaces/IFC4/IfcSurfaceFeature.cs | 24 ++-- .../Interfaces/IFC4/IfcSwitchingDevice.cs | 6 +- .../Interfaces/IFC4/IfcSwitchingDeviceType.cs | 6 +- .../IFC4/IfcSystemFurnitureElement.cs | 3 +- .../IFC4/IfcSystemFurnitureElementType.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcTank.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcTankType.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcTask.cs | 27 ++--- Xbim.Ifc4x3/Interfaces/IFC4/IfcTaskType.cs | 27 ++--- Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformer.cs | 6 +- .../Interfaces/IFC4/IfcTransformerType.cs | 6 +- .../Interfaces/IFC4/IfcTransportElement.cs | 3 +- .../IFC4/IfcTransportElementType.cs | 3 +- .../IFC4/IfcUnitaryControlElement.cs | 6 +- .../IFC4/IfcUnitaryControlElementType.cs | 6 +- .../Interfaces/IFC4/IfcVibrationIsolator.cs | 3 +- .../IFC4/IfcVibrationIsolatorType.cs | 3 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcWall.cs | 6 +- Xbim.Ifc4x3/Interfaces/IFC4/IfcWallType.cs | 6 +- Xbim.Ifc4x3/Interfaces/IFC4X1/IfcReferent.cs | 21 ++-- .../IfcObjectDefinitionExtensions.cs | 41 +++++++ 88 files changed, 715 insertions(+), 1000 deletions(-) create mode 100644 Xbim.Ifc4x3/Interfaces/IfcObjectDefinitionExtensions.cs diff --git a/Tests/Ifc4x3Tests.cs b/Tests/Ifc4x3Tests.cs index 37025da6a..37bd8bb4d 100644 --- a/Tests/Ifc4x3Tests.cs +++ b/Tests/Ifc4x3Tests.cs @@ -220,5 +220,34 @@ public void IfcCoordinateReferenceSystemVerticalDatumCanReadAndSetNull() projectedCoords.VerticalDatum.HasValue.Should().BeFalse(); } + + [TestMethod] + public void Accessing4x3EnumsViaIfc4GivesUserDefined() + { + using var model = new MemoryModel(new EntityFactoryIfc4x3Add2()); + using var txn = model.BeginTransaction("Creation"); + + + var appliance = model.Instances.New(o => o.PredefinedType = Ifc4x3.ElectricalDomain.IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL); + IIfcAudioVisualAppliance ifc4Appliance = appliance; + + ifc4Appliance.PredefinedType.Should().Be(IfcAudioVisualApplianceTypeEnum.USERDEFINED); + + ifc4Appliance.GetPredefinedTypeValue().Should().Be("COMMUNICATIONTERMINAL"); + + } + + [TestMethod] + public void Accessing4x3EnumsViaIfc4GivesUserDefinedEdgeCase() + { + using var model = new MemoryModel(new EntityFactoryIfc4x3Add2()); + using var txn = model.BeginTransaction("Creation"); + + + var appliance = model.Instances.New(); + // Enum does not have USERDEFINED + appliance.GetUserDefined().Should().Be(IO.XbimStoreType.EsentDatabase, "defaults to first enum"); + } + } } diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarm.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarm.cs index cf178bee4..029ccbaa0 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarm.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarm.cs @@ -39,16 +39,14 @@ public partial class @IfcAlarm : IIfcAlarm case IfcAlarmTypeEnum.MANUALPULLBOX: return Ifc4.Interfaces.IfcAlarmTypeEnum.MANUALPULLBOX; case IfcAlarmTypeEnum.RAILWAYCROCODILE: - //## Handle translation of RAILWAYCROCODILE member from IfcAlarmTypeEnum in property PredefinedType - //TODO: Handle translation of RAILWAYCROCODILE member from IfcAlarmTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + //## Handle translation of RAILWAYCROCODILE member from IfcAlarmTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcAlarmTypeEnum.RAILWAYDETONATOR: - //## Handle translation of RAILWAYDETONATOR member from IfcAlarmTypeEnum in property PredefinedType - //TODO: Handle translation of RAILWAYDETONATOR member from IfcAlarmTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + case IfcAlarmTypeEnum.RAILWAYDETONATOR: + //## Handle translation of RAILWAYDETONATOR member from IfcAlarmTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcAlarmTypeEnum.SIREN: + case IfcAlarmTypeEnum.SIREN: return Ifc4.Interfaces.IfcAlarmTypeEnum.SIREN; case IfcAlarmTypeEnum.WHISTLE: return Ifc4.Interfaces.IfcAlarmTypeEnum.WHISTLE; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarmType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarmType.cs index d1affa1d7..4ba63ad4a 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarmType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAlarmType.cs @@ -39,16 +39,14 @@ Ifc4.Interfaces.IfcAlarmTypeEnum IIfcAlarmType.PredefinedType case IfcAlarmTypeEnum.MANUALPULLBOX: return Ifc4.Interfaces.IfcAlarmTypeEnum.MANUALPULLBOX; case IfcAlarmTypeEnum.RAILWAYCROCODILE: - //## Handle translation of RAILWAYCROCODILE member from IfcAlarmTypeEnum in property PredefinedType - //TODO: Handle translation of RAILWAYCROCODILE member from IfcAlarmTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + //## Handle translation of RAILWAYCROCODILE member from IfcAlarmTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcAlarmTypeEnum.RAILWAYDETONATOR: - //## Handle translation of RAILWAYDETONATOR member from IfcAlarmTypeEnum in property PredefinedType - //TODO: Handle translation of RAILWAYDETONATOR member from IfcAlarmTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcAlarmTypeEnum.SIREN: + case IfcAlarmTypeEnum.RAILWAYDETONATOR: + //## Handle translation of RAILWAYDETONATOR member from IfcAlarmTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcAlarmTypeEnum.SIREN: return Ifc4.Interfaces.IfcAlarmTypeEnum.SIREN; case IfcAlarmTypeEnum.WHISTLE: return Ifc4.Interfaces.IfcAlarmTypeEnum.WHISTLE; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAppliedValue.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAppliedValue.cs index e86923b61..b8c6001d2 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAppliedValue.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAppliedValue.cs @@ -1175,8 +1175,7 @@ IIfcMeasureWithUnit IIfcAppliedValue.UnitBasis return Ifc4.Interfaces.IfcArithmeticOperatorEnum.DIVIDE; case IfcArithmeticOperatorEnum.MODULO: //## Handle translation of MODULO member from IfcArithmeticOperatorEnum in property ArithmeticOperator - //TODO: Handle translation of MODULO member from IfcArithmeticOperatorEnum in property ArithmeticOperator - throw new System.NotImplementedException(); + throw new System.NotSupportedException("MODULO operation only supported in IFC4.3+"); //## case IfcArithmeticOperatorEnum.MULTIPLY: return Ifc4.Interfaces.IfcArithmeticOperatorEnum.MULTIPLY; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualAppliance.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualAppliance.cs index d12796488..289d9c9b2 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualAppliance.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualAppliance.cs @@ -35,11 +35,10 @@ public partial class @IfcAudioVisualAppliance : IIfcAudioVisualAppliance case IfcAudioVisualApplianceTypeEnum.CAMERA: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.CAMERA; case IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL: - //## Handle translation of COMMUNICATIONTERMINAL member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of COMMUNICATIONTERMINAL member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + //## Handle translation of COMMUNICATIONTERMINAL member from IfcAudioVisualApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcAudioVisualApplianceTypeEnum.DISPLAY: + case IfcAudioVisualApplianceTypeEnum.DISPLAY: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.DISPLAY; case IfcAudioVisualApplianceTypeEnum.MICROPHONE: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.MICROPHONE; @@ -50,11 +49,10 @@ public partial class @IfcAudioVisualAppliance : IIfcAudioVisualAppliance case IfcAudioVisualApplianceTypeEnum.RECEIVER: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.RECEIVER; case IfcAudioVisualApplianceTypeEnum.RECORDINGEQUIPMENT: - //## Handle translation of RECORDINGEQUIPMENT member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of RECORDINGEQUIPMENT member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + //## Handle translation of RECORDINGEQUIPMENT member from IfcAudioVisualApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcAudioVisualApplianceTypeEnum.SPEAKER: + case IfcAudioVisualApplianceTypeEnum.SPEAKER: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.SPEAKER; case IfcAudioVisualApplianceTypeEnum.SWITCHER: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.SWITCHER; @@ -68,9 +66,9 @@ public partial class @IfcAudioVisualAppliance : IIfcAudioVisualAppliance return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.USERDEFINED; case IfcAudioVisualApplianceTypeEnum.NOTDEFINED: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.NOTDEFINED; - case null: + case null: return null; - + default: throw new System.ArgumentOutOfRangeException(); } diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualApplianceType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualApplianceType.cs index 2931111de..bbd4f3c95 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualApplianceType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcAudioVisualApplianceType.cs @@ -35,11 +35,10 @@ Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum IIfcAudioVisualApplianceType.Pre case IfcAudioVisualApplianceTypeEnum.CAMERA: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.CAMERA; case IfcAudioVisualApplianceTypeEnum.COMMUNICATIONTERMINAL: - //## Handle translation of COMMUNICATIONTERMINAL member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of COMMUNICATIONTERMINAL member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + //## Handle translation of COMMUNICATIONTERMINAL member from IfcAudioVisualApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcAudioVisualApplianceTypeEnum.DISPLAY: + case IfcAudioVisualApplianceTypeEnum.DISPLAY: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.DISPLAY; case IfcAudioVisualApplianceTypeEnum.MICROPHONE: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.MICROPHONE; @@ -50,11 +49,10 @@ Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum IIfcAudioVisualApplianceType.Pre case IfcAudioVisualApplianceTypeEnum.RECEIVER: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.RECEIVER; case IfcAudioVisualApplianceTypeEnum.RECORDINGEQUIPMENT: - //## Handle translation of RECORDINGEQUIPMENT member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of RECORDINGEQUIPMENT member from IfcAudioVisualApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + //## Handle translation of RECORDINGEQUIPMENT member from IfcAudioVisualApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcAudioVisualApplianceTypeEnum.SPEAKER: + case IfcAudioVisualApplianceTypeEnum.SPEAKER: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.SPEAKER; case IfcAudioVisualApplianceTypeEnum.SWITCHER: return Ifc4.Interfaces.IfcAudioVisualApplianceTypeEnum.SWITCHER; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeam.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeam.cs index 6db9835dc..1062d1798 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeam.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeam.cs @@ -33,42 +33,36 @@ public partial class @IfcBeam : IIfcBeam case IfcBeamTypeEnum.BEAM: return Ifc4.Interfaces.IfcBeamTypeEnum.BEAM; case IfcBeamTypeEnum.CORNICE: - //## Handle translation of CORNICE member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of CORNICE member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.DIAPHRAGM: - //## Handle translation of DIAPHRAGM member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of DIAPHRAGM member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.EDGEBEAM: - //## Handle translation of EDGEBEAM member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of EDGEBEAM member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.GIRDER_SEGMENT: - //## Handle translation of GIRDER_SEGMENT member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of GIRDER_SEGMENT member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.HATSTONE: - //## Handle translation of HATSTONE member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of HATSTONE member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.HOLLOWCORE: + //## Handle translation of CORNICE member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.DIAPHRAGM: + //## Handle translation of DIAPHRAGM member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.EDGEBEAM: + //## Handle translation of EDGEBEAM member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.GIRDER_SEGMENT: + //## Handle translation of GIRDER_SEGMENT member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.HATSTONE: + //## Handle translation of HATSTONE member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.HOLLOWCORE: return Ifc4.Interfaces.IfcBeamTypeEnum.HOLLOWCORE; case IfcBeamTypeEnum.JOIST: return Ifc4.Interfaces.IfcBeamTypeEnum.JOIST; case IfcBeamTypeEnum.LINTEL: return Ifc4.Interfaces.IfcBeamTypeEnum.LINTEL; case IfcBeamTypeEnum.PIERCAP: - //## Handle translation of PIERCAP member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of PIERCAP member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.SPANDREL: + //## Handle translation of PIERCAP member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.SPANDREL: return Ifc4.Interfaces.IfcBeamTypeEnum.SPANDREL; case IfcBeamTypeEnum.T_BEAM: return Ifc4.Interfaces.IfcBeamTypeEnum.T_BEAM; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeamType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeamType.cs index ec1979eba..d0ebc069d 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeamType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBeamType.cs @@ -33,42 +33,36 @@ Ifc4.Interfaces.IfcBeamTypeEnum IIfcBeamType.PredefinedType case IfcBeamTypeEnum.BEAM: return Ifc4.Interfaces.IfcBeamTypeEnum.BEAM; case IfcBeamTypeEnum.CORNICE: - //## Handle translation of CORNICE member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of CORNICE member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.DIAPHRAGM: - //## Handle translation of DIAPHRAGM member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of DIAPHRAGM member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.EDGEBEAM: - //## Handle translation of EDGEBEAM member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of EDGEBEAM member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.GIRDER_SEGMENT: - //## Handle translation of GIRDER_SEGMENT member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of GIRDER_SEGMENT member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.HATSTONE: - //## Handle translation of HATSTONE member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of HATSTONE member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.HOLLOWCORE: + //## Handle translation of CORNICE member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.DIAPHRAGM: + //## Handle translation of DIAPHRAGM member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.EDGEBEAM: + //## Handle translation of EDGEBEAM member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.GIRDER_SEGMENT: + //## Handle translation of GIRDER_SEGMENT member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.HATSTONE: + //## Handle translation of HATSTONE member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.HOLLOWCORE: return Ifc4.Interfaces.IfcBeamTypeEnum.HOLLOWCORE; case IfcBeamTypeEnum.JOIST: return Ifc4.Interfaces.IfcBeamTypeEnum.JOIST; case IfcBeamTypeEnum.LINTEL: return Ifc4.Interfaces.IfcBeamTypeEnum.LINTEL; case IfcBeamTypeEnum.PIERCAP: - //## Handle translation of PIERCAP member from IfcBeamTypeEnum in property PredefinedType - //TODO: Handle translation of PIERCAP member from IfcBeamTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBeamTypeEnum.SPANDREL: + //## Handle translation of PIERCAP member from IfcBeamTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBeamTypeEnum.SPANDREL: return Ifc4.Interfaces.IfcBeamTypeEnum.SPANDREL; case IfcBeamTypeEnum.T_BEAM: return Ifc4.Interfaces.IfcBeamTypeEnum.T_BEAM; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPart.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPart.cs index c4a31e05a..779d3e521 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPart.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPart.cs @@ -31,25 +31,20 @@ public partial class @IfcBuildingElementPart : IIfcBuildingElementPart switch (PredefinedType) { case IfcBuildingElementPartTypeEnum.APRON: - //## Handle translation of APRON member from IfcBuildingElementPartTypeEnum in property PredefinedType - //TODO: Handle translation of APRON member from IfcBuildingElementPartTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); + case IfcBuildingElementPartTypeEnum.ARMOURUNIT: + //## Handle translation of ARMOURUNIT member from IfcBuildingElementPartTypeEnum in property PredefinedType + return this.GetUserDefined(); //## - case IfcBuildingElementPartTypeEnum.ARMOURUNIT: - //## Handle translation of ARMOURUNIT member from IfcBuildingElementPartTypeEnum in property PredefinedType - //TODO: Handle translation of ARMOURUNIT member from IfcBuildingElementPartTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBuildingElementPartTypeEnum.INSULATION: + case IfcBuildingElementPartTypeEnum.INSULATION: return Ifc4.Interfaces.IfcBuildingElementPartTypeEnum.INSULATION; case IfcBuildingElementPartTypeEnum.PRECASTPANEL: return Ifc4.Interfaces.IfcBuildingElementPartTypeEnum.PRECASTPANEL; case IfcBuildingElementPartTypeEnum.SAFETYCAGE: - //## Handle translation of SAFETYCAGE member from IfcBuildingElementPartTypeEnum in property PredefinedType - //TODO: Handle translation of SAFETYCAGE member from IfcBuildingElementPartTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBuildingElementPartTypeEnum.USERDEFINED: + //## Handle translation of SAFETYCAGE member from IfcBuildingElementPartTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBuildingElementPartTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcBuildingElementPartTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPartType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPartType.cs index 6d34886e6..3285bfe90 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPartType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcBuildingElementPartType.cs @@ -31,25 +31,22 @@ Ifc4.Interfaces.IfcBuildingElementPartTypeEnum IIfcBuildingElementPartType.Prede switch (PredefinedType) { case IfcBuildingElementPartTypeEnum.APRON: - //## Handle translation of APRON member from IfcBuildingElementPartTypeEnum in property PredefinedType - //TODO: Handle translation of APRON member from IfcBuildingElementPartTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBuildingElementPartTypeEnum.ARMOURUNIT: - //## Handle translation of ARMOURUNIT member from IfcBuildingElementPartTypeEnum in property PredefinedType - //TODO: Handle translation of ARMOURUNIT member from IfcBuildingElementPartTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBuildingElementPartTypeEnum.INSULATION: + //## Handle translation of APRON member from IfcBuildingElementPartTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBuildingElementPartTypeEnum.ARMOURUNIT: + //## Handle translation of ARMOURUNIT member from IfcBuildingElementPartTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBuildingElementPartTypeEnum.INSULATION: return Ifc4.Interfaces.IfcBuildingElementPartTypeEnum.INSULATION; case IfcBuildingElementPartTypeEnum.PRECASTPANEL: return Ifc4.Interfaces.IfcBuildingElementPartTypeEnum.PRECASTPANEL; case IfcBuildingElementPartTypeEnum.SAFETYCAGE: - //## Handle translation of SAFETYCAGE member from IfcBuildingElementPartTypeEnum in property PredefinedType - //TODO: Handle translation of SAFETYCAGE member from IfcBuildingElementPartTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcBuildingElementPartTypeEnum.USERDEFINED: + //## Handle translation of SAFETYCAGE member from IfcBuildingElementPartTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcBuildingElementPartTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcBuildingElementPartTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFitting.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFitting.cs index a9f785473..938c9b07c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFitting.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFitting.cs @@ -33,27 +33,24 @@ public partial class @IfcCableCarrierFitting : IIfcCableCarrierFitting case IfcCableCarrierFittingTypeEnum.BEND: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.BEND; case IfcCableCarrierFittingTypeEnum.CONNECTOR: - //## Handle translation of CONNECTOR member from IfcCableCarrierFittingTypeEnum in property PredefinedType - //TODO: Handle translation of CONNECTOR member from IfcCableCarrierFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierFittingTypeEnum.CROSS: + //## Handle translation of CONNECTOR member from IfcCableCarrierFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierFittingTypeEnum.CROSS: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.CROSS; case IfcCableCarrierFittingTypeEnum.JUNCTION: - //## Handle translation of JUNCTION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - //TODO: Handle translation of JUNCTION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierFittingTypeEnum.REDUCER: + //## Handle translation of JUNCTION member from IfcCableCarrierFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierFittingTypeEnum.REDUCER: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.REDUCER; case IfcCableCarrierFittingTypeEnum.TEE: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.TEE; case IfcCableCarrierFittingTypeEnum.TRANSITION: - //## Handle translation of TRANSITION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSITION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierFittingTypeEnum.USERDEFINED: + //## Handle translation of TRANSITION member from IfcCableCarrierFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierFittingTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFittingType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFittingType.cs index f97d58d84..f14f27d9c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFittingType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierFittingType.cs @@ -33,27 +33,24 @@ Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum IIfcCableCarrierFittingType.Prede case IfcCableCarrierFittingTypeEnum.BEND: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.BEND; case IfcCableCarrierFittingTypeEnum.CONNECTOR: - //## Handle translation of CONNECTOR member from IfcCableCarrierFittingTypeEnum in property PredefinedType - //TODO: Handle translation of CONNECTOR member from IfcCableCarrierFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierFittingTypeEnum.CROSS: + //## Handle translation of CONNECTOR member from IfcCableCarrierFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierFittingTypeEnum.CROSS: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.CROSS; case IfcCableCarrierFittingTypeEnum.JUNCTION: - //## Handle translation of JUNCTION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - //TODO: Handle translation of JUNCTION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierFittingTypeEnum.REDUCER: + //## Handle translation of JUNCTION member from IfcCableCarrierFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierFittingTypeEnum.REDUCER: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.REDUCER; case IfcCableCarrierFittingTypeEnum.TEE: return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.TEE; case IfcCableCarrierFittingTypeEnum.TRANSITION: - //## Handle translation of TRANSITION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSITION member from IfcCableCarrierFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierFittingTypeEnum.USERDEFINED: + //## Handle translation of TRANSITION member from IfcCableCarrierFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierFittingTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCableCarrierFittingTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegment.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegment.cs index a46412f2c..f288503ac 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegment.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegment.cs @@ -31,29 +31,26 @@ public partial class @IfcCableCarrierSegment : IIfcCableCarrierSegment switch (PredefinedType) { case IfcCableCarrierSegmentTypeEnum.CABLEBRACKET: - //## Handle translation of CABLEBRACKET member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of CABLEBRACKET member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT: + //## Handle translation of CABLEBRACKET member from IfcCableCarrierSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT; case IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT; case IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT; case IfcCableCarrierSegmentTypeEnum.CATENARYWIRE: - //## Handle translation of CATENARYWIRE member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of CATENARYWIRE member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT: + //## Handle translation of CATENARYWIRE member from IfcCableCarrierSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT; case IfcCableCarrierSegmentTypeEnum.DROPPER: - //## Handle translation of DROPPER member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of DROPPER member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierSegmentTypeEnum.USERDEFINED: + //## Handle translation of DROPPER member from IfcCableCarrierSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierSegmentTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegmentType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegmentType.cs index 17d59035a..f5f4b6c5a 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegmentType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableCarrierSegmentType.cs @@ -31,29 +31,26 @@ Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum IIfcCableCarrierSegmentType.Prede switch (PredefinedType) { case IfcCableCarrierSegmentTypeEnum.CABLEBRACKET: - //## Handle translation of CABLEBRACKET member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of CABLEBRACKET member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT: + //## Handle translation of CABLEBRACKET member from IfcCableCarrierSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CABLELADDERSEGMENT; case IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CABLETRAYSEGMENT; case IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CABLETRUNKINGSEGMENT; case IfcCableCarrierSegmentTypeEnum.CATENARYWIRE: - //## Handle translation of CATENARYWIRE member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of CATENARYWIRE member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT: + //## Handle translation of CATENARYWIRE member from IfcCableCarrierSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT: return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.CONDUITSEGMENT; case IfcCableCarrierSegmentTypeEnum.DROPPER: - //## Handle translation of DROPPER member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of DROPPER member from IfcCableCarrierSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableCarrierSegmentTypeEnum.USERDEFINED: + //## Handle translation of DROPPER member from IfcCableCarrierSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableCarrierSegmentTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCableCarrierSegmentTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFitting.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFitting.cs index 322e19339..8af922158 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFitting.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFitting.cs @@ -37,11 +37,10 @@ public partial class @IfcCableFitting : IIfcCableFitting case IfcCableFittingTypeEnum.EXIT: return Ifc4.Interfaces.IfcCableFittingTypeEnum.EXIT; case IfcCableFittingTypeEnum.FANOUT: - //## Handle translation of FANOUT member from IfcCableFittingTypeEnum in property PredefinedType - //TODO: Handle translation of FANOUT member from IfcCableFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableFittingTypeEnum.JUNCTION: + //## Handle translation of FANOUT member from IfcCableFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableFittingTypeEnum.JUNCTION: return Ifc4.Interfaces.IfcCableFittingTypeEnum.JUNCTION; case IfcCableFittingTypeEnum.TRANSITION: return Ifc4.Interfaces.IfcCableFittingTypeEnum.TRANSITION; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFittingType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFittingType.cs index 3b549d345..cc8a6e288 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFittingType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableFittingType.cs @@ -37,11 +37,10 @@ Ifc4.Interfaces.IfcCableFittingTypeEnum IIfcCableFittingType.PredefinedType case IfcCableFittingTypeEnum.EXIT: return Ifc4.Interfaces.IfcCableFittingTypeEnum.EXIT; case IfcCableFittingTypeEnum.FANOUT: - //## Handle translation of FANOUT member from IfcCableFittingTypeEnum in property PredefinedType - //TODO: Handle translation of FANOUT member from IfcCableFittingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableFittingTypeEnum.JUNCTION: + //## Handle translation of FANOUT member from IfcCableFittingTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableFittingTypeEnum.JUNCTION: return Ifc4.Interfaces.IfcCableFittingTypeEnum.JUNCTION; case IfcCableFittingTypeEnum.TRANSITION: return Ifc4.Interfaces.IfcCableFittingTypeEnum.TRANSITION; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegment.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegment.cs index bb5101bdc..33f8be683 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegment.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegment.cs @@ -37,38 +37,32 @@ public partial class @IfcCableSegment : IIfcCableSegment case IfcCableSegmentTypeEnum.CONDUCTORSEGMENT: return Ifc4.Interfaces.IfcCableSegmentTypeEnum.CONDUCTORSEGMENT; case IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT: - //## Handle translation of CONTACTWIRESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of CONTACTWIRESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.CORESEGMENT: + //## Handle translation of CONTACTWIRESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.CORESEGMENT: return Ifc4.Interfaces.IfcCableSegmentTypeEnum.CORESEGMENT; case IfcCableSegmentTypeEnum.FIBERSEGMENT: - //## Handle translation of FIBERSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of FIBERSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.FIBERTUBE: - //## Handle translation of FIBERTUBE member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of FIBERTUBE member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT: - //## Handle translation of OPTICALCABLESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of OPTICALCABLESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.STITCHWIRE: - //## Handle translation of STITCHWIRE member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of STITCHWIRE member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.WIREPAIRSEGMENT: - //## Handle translation of WIREPAIRSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of WIREPAIRSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.USERDEFINED: + //## Handle translation of FIBERSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.FIBERTUBE: + //## Handle translation of FIBERTUBE member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT: + //## Handle translation of OPTICALCABLESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.STITCHWIRE: + //## Handle translation of STITCHWIRE member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.WIREPAIRSEGMENT: + //## Handle translation of WIREPAIRSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCableSegmentTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegmentType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegmentType.cs index 00703658f..82c687c0c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegmentType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCableSegmentType.cs @@ -37,38 +37,32 @@ Ifc4.Interfaces.IfcCableSegmentTypeEnum IIfcCableSegmentType.PredefinedType case IfcCableSegmentTypeEnum.CONDUCTORSEGMENT: return Ifc4.Interfaces.IfcCableSegmentTypeEnum.CONDUCTORSEGMENT; case IfcCableSegmentTypeEnum.CONTACTWIRESEGMENT: - //## Handle translation of CONTACTWIRESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of CONTACTWIRESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.CORESEGMENT: + //## Handle translation of CONTACTWIRESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.CORESEGMENT: return Ifc4.Interfaces.IfcCableSegmentTypeEnum.CORESEGMENT; case IfcCableSegmentTypeEnum.FIBERSEGMENT: - //## Handle translation of FIBERSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of FIBERSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.FIBERTUBE: - //## Handle translation of FIBERTUBE member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of FIBERTUBE member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT: - //## Handle translation of OPTICALCABLESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of OPTICALCABLESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.STITCHWIRE: - //## Handle translation of STITCHWIRE member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of STITCHWIRE member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.WIREPAIRSEGMENT: - //## Handle translation of WIREPAIRSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - //TODO: Handle translation of WIREPAIRSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCableSegmentTypeEnum.USERDEFINED: + //## Handle translation of FIBERSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.FIBERTUBE: + //## Handle translation of FIBERTUBE member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.OPTICALCABLESEGMENT: + //## Handle translation of OPTICALCABLESEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.STITCHWIRE: + //## Handle translation of STITCHWIRE member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.WIREPAIRSEGMENT: + //## Handle translation of WIREPAIRSEGMENT member from IfcCableSegmentTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCableSegmentTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCableSegmentTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumn.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumn.cs index 958fa0cff..45e58904d 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumn.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumn.cs @@ -33,23 +33,20 @@ public partial class @IfcColumn : IIfcColumn case IfcColumnTypeEnum.COLUMN: return Ifc4.Interfaces.IfcColumnTypeEnum.COLUMN; case IfcColumnTypeEnum.PIERSTEM: - //## Handle translation of PIERSTEM member from IfcColumnTypeEnum in property PredefinedType - //TODO: Handle translation of PIERSTEM member from IfcColumnTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcColumnTypeEnum.PIERSTEM_SEGMENT: - //## Handle translation of PIERSTEM_SEGMENT member from IfcColumnTypeEnum in property PredefinedType - //TODO: Handle translation of PIERSTEM_SEGMENT member from IfcColumnTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcColumnTypeEnum.PILASTER: + //## Handle translation of PIERSTEM member from IfcColumnTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcColumnTypeEnum.PIERSTEM_SEGMENT: + //## Handle translation of PIERSTEM_SEGMENT member from IfcColumnTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcColumnTypeEnum.PILASTER: return Ifc4.Interfaces.IfcColumnTypeEnum.PILASTER; case IfcColumnTypeEnum.STANDCOLUMN: - //## Handle translation of STANDCOLUMN member from IfcColumnTypeEnum in property PredefinedType - //TODO: Handle translation of STANDCOLUMN member from IfcColumnTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcColumnTypeEnum.USERDEFINED: + //## Handle translation of STANDCOLUMN member from IfcColumnTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcColumnTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcColumnTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumnType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumnType.cs index e70b0ecb6..f3545af0a 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumnType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcColumnType.cs @@ -33,23 +33,20 @@ Ifc4.Interfaces.IfcColumnTypeEnum IIfcColumnType.PredefinedType case IfcColumnTypeEnum.COLUMN: return Ifc4.Interfaces.IfcColumnTypeEnum.COLUMN; case IfcColumnTypeEnum.PIERSTEM: - //## Handle translation of PIERSTEM member from IfcColumnTypeEnum in property PredefinedType - //TODO: Handle translation of PIERSTEM member from IfcColumnTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcColumnTypeEnum.PIERSTEM_SEGMENT: - //## Handle translation of PIERSTEM_SEGMENT member from IfcColumnTypeEnum in property PredefinedType - //TODO: Handle translation of PIERSTEM_SEGMENT member from IfcColumnTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcColumnTypeEnum.PILASTER: + //## Handle translation of PIERSTEM member from IfcColumnTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcColumnTypeEnum.PIERSTEM_SEGMENT: + //## Handle translation of PIERSTEM_SEGMENT member from IfcColumnTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcColumnTypeEnum.PILASTER: return Ifc4.Interfaces.IfcColumnTypeEnum.PILASTER; case IfcColumnTypeEnum.STANDCOLUMN: - //## Handle translation of STANDCOLUMN member from IfcColumnTypeEnum in property PredefinedType - //TODO: Handle translation of STANDCOLUMN member from IfcColumnTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcColumnTypeEnum.USERDEFINED: + //## Handle translation of STANDCOLUMN member from IfcColumnTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcColumnTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcColumnTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsAppliance.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsAppliance.cs index 5cac472af..91422d7a4 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsAppliance.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsAppliance.cs @@ -33,32 +33,28 @@ public partial class @IfcCommunicationsAppliance : IIfcCommunicationsAppliance case IfcCommunicationsApplianceTypeEnum.ANTENNA: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.ANTENNA; case IfcCommunicationsApplianceTypeEnum.AUTOMATON: - //## Handle translation of AUTOMATON member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of AUTOMATON member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.COMPUTER: + //## Handle translation of AUTOMATON member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.COMPUTER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.COMPUTER; case IfcCommunicationsApplianceTypeEnum.FAX: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.FAX; case IfcCommunicationsApplianceTypeEnum.GATEWAY: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.GATEWAY; case IfcCommunicationsApplianceTypeEnum.INTELLIGENTPERIPHERAL: - //## Handle translation of INTELLIGENTPERIPHERAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of INTELLIGENTPERIPHERAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT: - //## Handle translation of IPNETWORKEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of IPNETWORKEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT: - //## Handle translation of LINESIDEELECTRONICUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of LINESIDEELECTRONICUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.MODEM: + //## Handle translation of INTELLIGENTPERIPHERAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT: + //## Handle translation of IPNETWORKEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT: + //## Handle translation of LINESIDEELECTRONICUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.MODEM: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.MODEM; case IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE; @@ -67,54 +63,46 @@ public partial class @IfcCommunicationsAppliance : IIfcCommunicationsAppliance case IfcCommunicationsApplianceTypeEnum.NETWORKHUB: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.NETWORKHUB; case IfcCommunicationsApplianceTypeEnum.OPTICALLINETERMINAL: - //## Handle translation of OPTICALLINETERMINAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of OPTICALLINETERMINAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT: - //## Handle translation of OPTICALNETWORKUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of OPTICALNETWORKUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.PRINTER: + //## Handle translation of OPTICALLINETERMINAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT: + //## Handle translation of OPTICALNETWORKUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.PRINTER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.PRINTER; case IfcCommunicationsApplianceTypeEnum.RADIOBLOCKCENTER: - //## Handle translation of RADIOBLOCKCENTER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of RADIOBLOCKCENTER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.REPEATER: + //## Handle translation of RADIOBLOCKCENTER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.REPEATER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.REPEATER; case IfcCommunicationsApplianceTypeEnum.ROUTER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.ROUTER; case IfcCommunicationsApplianceTypeEnum.SCANNER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.SCANNER; case IfcCommunicationsApplianceTypeEnum.TELECOMMAND: - //## Handle translation of TELECOMMAND member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TELECOMMAND member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE: - //## Handle translation of TELEPHONYEXCHANGE member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TELEPHONYEXCHANGE member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT: - //## Handle translation of TRANSITIONCOMPONENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSITIONCOMPONENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TRANSPONDER: - //## Handle translation of TRANSPONDER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSPONDER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT: - //## Handle translation of TRANSPORTEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSPORTEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.USERDEFINED: + //## Handle translation of TELECOMMAND member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE: + //## Handle translation of TELEPHONYEXCHANGE member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT: + //## Handle translation of TRANSITIONCOMPONENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TRANSPONDER: + //## Handle translation of TRANSPONDER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT: + //## Handle translation of TRANSPORTEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsApplianceType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsApplianceType.cs index 394f0a73d..3f68aaf04 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsApplianceType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCommunicationsApplianceType.cs @@ -33,32 +33,28 @@ Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum IIfcCommunicationsApplianceTy case IfcCommunicationsApplianceTypeEnum.ANTENNA: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.ANTENNA; case IfcCommunicationsApplianceTypeEnum.AUTOMATON: - //## Handle translation of AUTOMATON member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of AUTOMATON member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.COMPUTER: + //## Handle translation of AUTOMATON member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.COMPUTER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.COMPUTER; case IfcCommunicationsApplianceTypeEnum.FAX: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.FAX; case IfcCommunicationsApplianceTypeEnum.GATEWAY: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.GATEWAY; case IfcCommunicationsApplianceTypeEnum.INTELLIGENTPERIPHERAL: - //## Handle translation of INTELLIGENTPERIPHERAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of INTELLIGENTPERIPHERAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT: - //## Handle translation of IPNETWORKEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of IPNETWORKEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT: - //## Handle translation of LINESIDEELECTRONICUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of LINESIDEELECTRONICUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.MODEM: + //## Handle translation of INTELLIGENTPERIPHERAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.IPNETWORKEQUIPMENT: + //## Handle translation of IPNETWORKEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.LINESIDEELECTRONICUNIT: + //## Handle translation of LINESIDEELECTRONICUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.MODEM: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.MODEM; case IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.NETWORKAPPLIANCE; @@ -67,54 +63,46 @@ Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum IIfcCommunicationsApplianceTy case IfcCommunicationsApplianceTypeEnum.NETWORKHUB: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.NETWORKHUB; case IfcCommunicationsApplianceTypeEnum.OPTICALLINETERMINAL: - //## Handle translation of OPTICALLINETERMINAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of OPTICALLINETERMINAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT: - //## Handle translation of OPTICALNETWORKUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of OPTICALNETWORKUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.PRINTER: + //## Handle translation of OPTICALLINETERMINAL member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.OPTICALNETWORKUNIT: + //## Handle translation of OPTICALNETWORKUNIT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.PRINTER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.PRINTER; case IfcCommunicationsApplianceTypeEnum.RADIOBLOCKCENTER: - //## Handle translation of RADIOBLOCKCENTER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of RADIOBLOCKCENTER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.REPEATER: + //## Handle translation of RADIOBLOCKCENTER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.REPEATER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.REPEATER; case IfcCommunicationsApplianceTypeEnum.ROUTER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.ROUTER; case IfcCommunicationsApplianceTypeEnum.SCANNER: return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.SCANNER; case IfcCommunicationsApplianceTypeEnum.TELECOMMAND: - //## Handle translation of TELECOMMAND member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TELECOMMAND member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE: - //## Handle translation of TELEPHONYEXCHANGE member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TELEPHONYEXCHANGE member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT: - //## Handle translation of TRANSITIONCOMPONENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSITIONCOMPONENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TRANSPONDER: - //## Handle translation of TRANSPONDER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSPONDER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT: - //## Handle translation of TRANSPORTEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSPORTEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCommunicationsApplianceTypeEnum.USERDEFINED: + //## Handle translation of TELECOMMAND member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TELEPHONYEXCHANGE: + //## Handle translation of TELEPHONYEXCHANGE member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TRANSITIONCOMPONENT: + //## Handle translation of TRANSITIONCOMPONENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TRANSPONDER: + //## Handle translation of TRANSPONDER member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.TRANSPORTEQUIPMENT: + //## Handle translation of TRANSPORTEQUIPMENT member from IfcCommunicationsApplianceTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCommunicationsApplianceTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. //## return Ifc4.Interfaces.IfcCommunicationsApplianceTypeEnum.USERDEFINED; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCovering.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCovering.cs index 7c8719040..f89991a2f 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCovering.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCovering.cs @@ -35,11 +35,10 @@ public partial class @IfcCovering : IIfcCovering case IfcCoveringTypeEnum.CLADDING: return Ifc4.Interfaces.IfcCoveringTypeEnum.CLADDING; case IfcCoveringTypeEnum.COPING: - //## Handle translation of COPING member from IfcCoveringTypeEnum in property PredefinedType - //TODO: Handle translation of COPING member from IfcCoveringTypeEnum in property PredefinedType - throw new System.NotImplementedException(); - //## - case IfcCoveringTypeEnum.FLOORING: + //## Handle translation of COPING member from IfcCoveringTypeEnum in property PredefinedType + return this.GetUserDefined(); + //## + case IfcCoveringTypeEnum.FLOORING: return Ifc4.Interfaces.IfcCoveringTypeEnum.FLOORING; case IfcCoveringTypeEnum.INSULATION: return Ifc4.Interfaces.IfcCoveringTypeEnum.INSULATION; @@ -55,8 +54,7 @@ public partial class @IfcCovering : IIfcCovering return Ifc4.Interfaces.IfcCoveringTypeEnum.SLEEVING; case IfcCoveringTypeEnum.TOPPING: //## Handle translation of TOPPING member from IfcCoveringTypeEnum in property PredefinedType - //TODO: Handle translation of TOPPING member from IfcCoveringTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcCoveringTypeEnum.WRAPPING: return Ifc4.Interfaces.IfcCoveringTypeEnum.WRAPPING; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoveringType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoveringType.cs index e4a3b3adf..d7369e8dc 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoveringType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCoveringType.cs @@ -36,8 +36,7 @@ Ifc4.Interfaces.IfcCoveringTypeEnum IIfcCoveringType.PredefinedType return Ifc4.Interfaces.IfcCoveringTypeEnum.CLADDING; case IfcCoveringTypeEnum.COPING: //## Handle translation of COPING member from IfcCoveringTypeEnum in property PredefinedType - //TODO: Handle translation of COPING member from IfcCoveringTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcCoveringTypeEnum.FLOORING: return Ifc4.Interfaces.IfcCoveringTypeEnum.FLOORING; @@ -55,8 +54,7 @@ Ifc4.Interfaces.IfcCoveringTypeEnum IIfcCoveringType.PredefinedType return Ifc4.Interfaces.IfcCoveringTypeEnum.SLEEVING; case IfcCoveringTypeEnum.TOPPING: //## Handle translation of TOPPING member from IfcCoveringTypeEnum in property PredefinedType - //TODO: Handle translation of TOPPING member from IfcCoveringTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcCoveringTypeEnum.WRAPPING: return Ifc4.Interfaces.IfcCoveringTypeEnum.WRAPPING; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessory.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessory.cs index fa3b64495..5867a3864 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessory.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessory.cs @@ -34,97 +34,79 @@ public partial class @IfcDiscreteAccessory : IIfcDiscreteAccessory return Ifc4.Interfaces.IfcDiscreteAccessoryTypeEnum.ANCHORPLATE; case IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION: //## Handle translation of BIRDPROTECTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of BIRDPROTECTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.BRACKET: return Ifc4.Interfaces.IfcDiscreteAccessoryTypeEnum.BRACKET; case IfcDiscreteAccessoryTypeEnum.CABLEARRANGER: //## Handle translation of CABLEARRANGER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of CABLEARRANGER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION: //## Handle translation of ELASTIC_CUSHION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of ELASTIC_CUSHION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE: //## Handle translation of EXPANSION_JOINT_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of EXPANSION_JOINT_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.FILLER: //## Handle translation of FILLER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of FILLER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.FLASHING: //## Handle translation of FLASHING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of FLASHING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.INSULATOR: //## Handle translation of INSULATOR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of INSULATOR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.LOCK: //## Handle translation of LOCK member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of LOCK member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING: //## Handle translation of PANEL_STRENGTHENING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of PANEL_STRENGTHENING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE: //## Handle translation of POINTMACHINEMOUNTINGDEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of POINTMACHINEMOUNTINGDEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE: //## Handle translation of POINT_MACHINE_LOCKING_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of POINT_MACHINE_LOCKING_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAILBRACE: //## Handle translation of RAILBRACE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAILBRACE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAILPAD: //## Handle translation of RAILPAD member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAILPAD member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION: //## Handle translation of RAIL_LUBRICATION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAIL_LUBRICATION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT: //## Handle translation of RAIL_MECHANICAL_EQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAIL_MECHANICAL_EQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.SHOE: return Ifc4.Interfaces.IfcDiscreteAccessoryTypeEnum.SHOE; case IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR: //## Handle translation of SLIDINGCHAIR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of SLIDINGCHAIR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION: //## Handle translation of SOUNDABSORPTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of SOUNDABSORPTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT: //## Handle translation of TENSIONINGEQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of TENSIONINGEQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessoryType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessoryType.cs index 139b093ec..b05d4c4c7 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessoryType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDiscreteAccessoryType.cs @@ -34,97 +34,79 @@ Ifc4.Interfaces.IfcDiscreteAccessoryTypeEnum IIfcDiscreteAccessoryType.Predefine return Ifc4.Interfaces.IfcDiscreteAccessoryTypeEnum.ANCHORPLATE; case IfcDiscreteAccessoryTypeEnum.BIRDPROTECTION: //## Handle translation of BIRDPROTECTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of BIRDPROTECTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.BRACKET: return Ifc4.Interfaces.IfcDiscreteAccessoryTypeEnum.BRACKET; case IfcDiscreteAccessoryTypeEnum.CABLEARRANGER: //## Handle translation of CABLEARRANGER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of CABLEARRANGER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.ELASTIC_CUSHION: //## Handle translation of ELASTIC_CUSHION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of ELASTIC_CUSHION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.EXPANSION_JOINT_DEVICE: //## Handle translation of EXPANSION_JOINT_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of EXPANSION_JOINT_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.FILLER: //## Handle translation of FILLER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of FILLER member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.FLASHING: //## Handle translation of FLASHING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of FLASHING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.INSULATOR: //## Handle translation of INSULATOR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of INSULATOR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.LOCK: //## Handle translation of LOCK member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of LOCK member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.PANEL_STRENGTHENING: //## Handle translation of PANEL_STRENGTHENING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of PANEL_STRENGTHENING member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.POINTMACHINEMOUNTINGDEVICE: //## Handle translation of POINTMACHINEMOUNTINGDEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of POINTMACHINEMOUNTINGDEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.POINT_MACHINE_LOCKING_DEVICE: //## Handle translation of POINT_MACHINE_LOCKING_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of POINT_MACHINE_LOCKING_DEVICE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAILBRACE: //## Handle translation of RAILBRACE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAILBRACE member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAILPAD: //## Handle translation of RAILPAD member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAILPAD member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAIL_LUBRICATION: //## Handle translation of RAIL_LUBRICATION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAIL_LUBRICATION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.RAIL_MECHANICAL_EQUIPMENT: //## Handle translation of RAIL_MECHANICAL_EQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of RAIL_MECHANICAL_EQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.SHOE: return Ifc4.Interfaces.IfcDiscreteAccessoryTypeEnum.SHOE; case IfcDiscreteAccessoryTypeEnum.SLIDINGCHAIR: //## Handle translation of SLIDINGCHAIR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of SLIDINGCHAIR member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.SOUNDABSORPTION: //## Handle translation of SOUNDABSORPTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of SOUNDABSORPTION member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.TENSIONINGEQUIPMENT: //## Handle translation of TENSIONINGEQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - //TODO: Handle translation of TENSIONINGEQUIPMENT member from IfcDiscreteAccessoryTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDiscreteAccessoryTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionPort.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionPort.cs index 730a33c43..671f82b34 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionPort.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionPort.cs @@ -93,8 +93,7 @@ public partial class @IfcDistributionPort : IIfcDistributionPort return Ifc4.Interfaces.IfcDistributionPortTypeEnum.PIPE; case IfcDistributionPortTypeEnum.WIRELESS: //## Handle translation of WIRELESS member from IfcDistributionPortTypeEnum in property PredefinedType - //TODO: Handle translation of WIRELESS member from IfcDistributionPortTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionPortTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. @@ -158,11 +157,10 @@ public partial class @IfcDistributionPort : IIfcDistributionPort case IfcDistributionSystemEnum.AUDIOVISUAL: return Ifc4.Interfaces.IfcDistributionSystemEnum.AUDIOVISUAL; case IfcDistributionSystemEnum.CATENARY_SYSTEM: - //## Handle translation of CATENARY_SYSTEM member from IfcDistributionSystemEnum in property SystemType - //TODO: Handle translation of CATENARY_SYSTEM member from IfcDistributionSystemEnum in property SystemType - throw new System.NotImplementedException(); - //## - case IfcDistributionSystemEnum.CHEMICAL: + //## Handle translation of CATENARY_SYSTEM member from IfcDistributionSystemEnum in property SystemType + return this.GetUserDefined(); + //## + case IfcDistributionSystemEnum.CHEMICAL: return Ifc4.Interfaces.IfcDistributionSystemEnum.CHEMICAL; case IfcDistributionSystemEnum.CHILLEDWATER: return Ifc4.Interfaces.IfcDistributionSystemEnum.CHILLEDWATER; @@ -197,11 +195,10 @@ public partial class @IfcDistributionPort : IIfcDistributionPort case IfcDistributionSystemEnum.FIREPROTECTION: return Ifc4.Interfaces.IfcDistributionSystemEnum.FIREPROTECTION; case IfcDistributionSystemEnum.FIXEDTRANSMISSIONNETWORK: - //## Handle translation of FIXEDTRANSMISSIONNETWORK member from IfcDistributionSystemEnum in property SystemType - //TODO: Handle translation of FIXEDTRANSMISSIONNETWORK member from IfcDistributionSystemEnum in property SystemType - throw new System.NotImplementedException(); - //## - case IfcDistributionSystemEnum.FUEL: + //## Handle translation of FIXEDTRANSMISSIONNETWORK member from IfcDistributionSystemEnum in property SystemType + return this.GetUserDefined(); + //## + case IfcDistributionSystemEnum.FUEL: return Ifc4.Interfaces.IfcDistributionSystemEnum.FUEL; case IfcDistributionSystemEnum.GAS: return Ifc4.Interfaces.IfcDistributionSystemEnum.GAS; @@ -214,43 +211,38 @@ public partial class @IfcDistributionPort : IIfcDistributionPort case IfcDistributionSystemEnum.LIGHTNINGPROTECTION: return Ifc4.Interfaces.IfcDistributionSystemEnum.LIGHTNINGPROTECTION; case IfcDistributionSystemEnum.MOBILENETWORK: - //## Handle translation of MOBILENETWORK member from IfcDistributionSystemEnum in property SystemType - //TODO: Handle translation of MOBILENETWORK member from IfcDistributionSystemEnum in property SystemType - throw new System.NotImplementedException(); - //## - case IfcDistributionSystemEnum.MONITORINGSYSTEM: - //## Handle translation of MONITORINGSYSTEM member from IfcDistributionSystemEnum in property SystemType - //TODO: Handle translation of MONITORINGSYSTEM member from IfcDistributionSystemEnum in property SystemType - throw new System.NotImplementedException(); - //## - case IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE: + //## Handle translation of MOBILENETWORK member from IfcDistributionSystemEnum in property SystemType + return this.GetUserDefined(); + //## + case IfcDistributionSystemEnum.MONITORINGSYSTEM: + //## Handle translation of MONITORINGSYSTEM member from IfcDistributionSystemEnum in property SystemType + return this.GetUserDefined(); + //## + case IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE: return Ifc4.Interfaces.IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE; case IfcDistributionSystemEnum.OIL: return Ifc4.Interfaces.IfcDistributionSystemEnum.OIL; case IfcDistributionSystemEnum.OPERATIONAL: return Ifc4.Interfaces.IfcDistributionSystemEnum.OPERATIONAL; case IfcDistributionSystemEnum.OPERATIONALTELEPHONYSYSTEM: - //## Handle translation of OPERATIONALTELEPHONYSYSTEM member from IfcDistributionSystemEnum in property SystemType - //TODO: Handle translation of OPERATIONALTELEPHONYSYSTEM member from IfcDistributionSystemEnum in property SystemType - throw new System.NotImplementedException(); - //## - case IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM: - //## Handle translation of OVERHEAD_CONTACTLINE_SYSTEM member from IfcDistributionSystemEnum in property SystemType - //TODO: Handle translation of OVERHEAD_CONTACTLINE_SYSTEM member from IfcDistributionSystemEnum in property SystemType - throw new System.NotImplementedException(); - //## - case IfcDistributionSystemEnum.POWERGENERATION: + //## Handle translation of OPERATIONALTELEPHONYSYSTEM member from IfcDistributionSystemEnum in property SystemType + return this.GetUserDefined(); + //## + case IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM: + //## Handle translation of OVERHEAD_CONTACTLINE_SYSTEM member from IfcDistributionSystemEnum in property SystemType + return this.GetUserDefined(); + //## + case IfcDistributionSystemEnum.POWERGENERATION: return Ifc4.Interfaces.IfcDistributionSystemEnum.POWERGENERATION; case IfcDistributionSystemEnum.RAINWATER: return Ifc4.Interfaces.IfcDistributionSystemEnum.RAINWATER; case IfcDistributionSystemEnum.REFRIGERATION: return Ifc4.Interfaces.IfcDistributionSystemEnum.REFRIGERATION; case IfcDistributionSystemEnum.RETURN_CIRCUIT: - //## Handle translation of RETURN_CIRCUIT member from IfcDistributionSystemEnum in property SystemType - //TODO: Handle translation of RETURN_CIRCUIT member from IfcDistributionSystemEnum in property SystemType - throw new System.NotImplementedException(); - //## - case IfcDistributionSystemEnum.SECURITY: + //## Handle translation of RETURN_CIRCUIT member from IfcDistributionSystemEnum in property SystemType + return this.GetUserDefined(); + //## + case IfcDistributionSystemEnum.SECURITY: return Ifc4.Interfaces.IfcDistributionSystemEnum.SECURITY; case IfcDistributionSystemEnum.SEWAGE: return Ifc4.Interfaces.IfcDistributionSystemEnum.SEWAGE; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionSystem.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionSystem.cs index d3a5e0b58..bcb28a87b 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionSystem.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDistributionSystem.cs @@ -53,8 +53,7 @@ public partial class @IfcDistributionSystem : IIfcDistributionSystem return Ifc4.Interfaces.IfcDistributionSystemEnum.AUDIOVISUAL; case IfcDistributionSystemEnum.CATENARY_SYSTEM: //## Handle translation of CATENARY_SYSTEM member from IfcDistributionSystemEnum in property PredefinedType - //TODO: Handle translation of CATENARY_SYSTEM member from IfcDistributionSystemEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionSystemEnum.CHEMICAL: return Ifc4.Interfaces.IfcDistributionSystemEnum.CHEMICAL; @@ -92,8 +91,7 @@ public partial class @IfcDistributionSystem : IIfcDistributionSystem return Ifc4.Interfaces.IfcDistributionSystemEnum.FIREPROTECTION; case IfcDistributionSystemEnum.FIXEDTRANSMISSIONNETWORK: //## Handle translation of FIXEDTRANSMISSIONNETWORK member from IfcDistributionSystemEnum in property PredefinedType - //TODO: Handle translation of FIXEDTRANSMISSIONNETWORK member from IfcDistributionSystemEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionSystemEnum.FUEL: return Ifc4.Interfaces.IfcDistributionSystemEnum.FUEL; @@ -109,13 +107,11 @@ public partial class @IfcDistributionSystem : IIfcDistributionSystem return Ifc4.Interfaces.IfcDistributionSystemEnum.LIGHTNINGPROTECTION; case IfcDistributionSystemEnum.MOBILENETWORK: //## Handle translation of MOBILENETWORK member from IfcDistributionSystemEnum in property PredefinedType - //TODO: Handle translation of MOBILENETWORK member from IfcDistributionSystemEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionSystemEnum.MONITORINGSYSTEM: //## Handle translation of MONITORINGSYSTEM member from IfcDistributionSystemEnum in property PredefinedType - //TODO: Handle translation of MONITORINGSYSTEM member from IfcDistributionSystemEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE: return Ifc4.Interfaces.IfcDistributionSystemEnum.MUNICIPALSOLIDWASTE; @@ -125,13 +121,11 @@ public partial class @IfcDistributionSystem : IIfcDistributionSystem return Ifc4.Interfaces.IfcDistributionSystemEnum.OPERATIONAL; case IfcDistributionSystemEnum.OPERATIONALTELEPHONYSYSTEM: //## Handle translation of OPERATIONALTELEPHONYSYSTEM member from IfcDistributionSystemEnum in property PredefinedType - //TODO: Handle translation of OPERATIONALTELEPHONYSYSTEM member from IfcDistributionSystemEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionSystemEnum.OVERHEAD_CONTACTLINE_SYSTEM: //## Handle translation of OVERHEAD_CONTACTLINE_SYSTEM member from IfcDistributionSystemEnum in property PredefinedType - //TODO: Handle translation of OVERHEAD_CONTACTLINE_SYSTEM member from IfcDistributionSystemEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionSystemEnum.POWERGENERATION: return Ifc4.Interfaces.IfcDistributionSystemEnum.POWERGENERATION; @@ -141,8 +135,7 @@ public partial class @IfcDistributionSystem : IIfcDistributionSystem return Ifc4.Interfaces.IfcDistributionSystemEnum.REFRIGERATION; case IfcDistributionSystemEnum.RETURN_CIRCUIT: //## Handle translation of RETURN_CIRCUIT member from IfcDistributionSystemEnum in property PredefinedType - //TODO: Handle translation of RETURN_CIRCUIT member from IfcDistributionSystemEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDistributionSystemEnum.SECURITY: return Ifc4.Interfaces.IfcDistributionSystemEnum.SECURITY; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoor.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoor.cs index cbcf2566c..6f1b1511c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoor.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoor.cs @@ -66,8 +66,7 @@ public partial class @IfcDoor : IIfcDoor { case IfcDoorTypeEnum.BOOM_BARRIER: //## Handle translation of BOOM_BARRIER member from IfcDoorTypeEnum in property PredefinedType - //TODO: Handle translation of BOOM_BARRIER member from IfcDoorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDoorTypeEnum.DOOR: return Ifc4.Interfaces.IfcDoorTypeEnum.DOOR; @@ -77,8 +76,7 @@ public partial class @IfcDoor : IIfcDoor return Ifc4.Interfaces.IfcDoorTypeEnum.TRAPDOOR; case IfcDoorTypeEnum.TURNSTILE: //## Handle translation of TURNSTILE member from IfcDoorTypeEnum in property PredefinedType - //TODO: Handle translation of TURNSTILE member from IfcDoorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDoorTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. @@ -139,11 +137,10 @@ public partial class @IfcDoor : IIfcDoor case IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING; case IfcDoorTypeOperationEnum.DOUBLE_DOOR_LIFTING_VERTICAL: - //## Handle translation of DOUBLE_DOOR_LIFTING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of DOUBLE_DOOR_LIFTING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING: + //## Handle translation of DOUBLE_DOOR_LIFTING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING; case IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT; @@ -160,28 +157,24 @@ public partial class @IfcDoor : IIfcDoor case IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT; case IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL: - //## Handle translation of LIFTING_HORIZONTAL member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of LIFTING_HORIZONTAL member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT: - //## Handle translation of LIFTING_VERTICAL_LEFT member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of LIFTING_VERTICAL_LEFT member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT: - //## Handle translation of LIFTING_VERTICAL_RIGHT member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of LIFTING_VERTICAL_RIGHT member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.REVOLVING: + //## Handle translation of LIFTING_HORIZONTAL member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT: + //## Handle translation of LIFTING_VERTICAL_LEFT member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT: + //## Handle translation of LIFTING_VERTICAL_RIGHT member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.REVOLVING: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.REVOLVING; case IfcDoorTypeOperationEnum.REVOLVING_VERTICAL: - //## Handle translation of REVOLVING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of REVOLVING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.ROLLINGUP: + //## Handle translation of REVOLVING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.ROLLINGUP: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.ROLLINGUP; case IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoorType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoorType.cs index 5acd6628c..899ad49d3 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoorType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcDoorType.cs @@ -32,8 +32,7 @@ Ifc4.Interfaces.IfcDoorTypeEnum IIfcDoorType.PredefinedType { case IfcDoorTypeEnum.BOOM_BARRIER: //## Handle translation of BOOM_BARRIER member from IfcDoorTypeEnum in property PredefinedType - //TODO: Handle translation of BOOM_BARRIER member from IfcDoorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDoorTypeEnum.DOOR: return Ifc4.Interfaces.IfcDoorTypeEnum.DOOR; @@ -43,8 +42,7 @@ Ifc4.Interfaces.IfcDoorTypeEnum IIfcDoorType.PredefinedType return Ifc4.Interfaces.IfcDoorTypeEnum.TRAPDOOR; case IfcDoorTypeEnum.TURNSTILE: //## Handle translation of TURNSTILE member from IfcDoorTypeEnum in property PredefinedType - //TODO: Handle translation of TURNSTILE member from IfcDoorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcDoorTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. @@ -99,11 +97,10 @@ Ifc4.Interfaces.IfcDoorTypeOperationEnum IIfcDoorType.OperationType case IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.DOUBLE_DOOR_FOLDING; case IfcDoorTypeOperationEnum.DOUBLE_DOOR_LIFTING_VERTICAL: - //## Handle translation of DOUBLE_DOOR_LIFTING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of DOUBLE_DOOR_LIFTING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING: + //## Handle translation of DOUBLE_DOOR_LIFTING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING; case IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT; @@ -120,28 +117,24 @@ Ifc4.Interfaces.IfcDoorTypeOperationEnum IIfcDoorType.OperationType case IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.FOLDING_TO_RIGHT; case IfcDoorTypeOperationEnum.LIFTING_HORIZONTAL: - //## Handle translation of LIFTING_HORIZONTAL member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of LIFTING_HORIZONTAL member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT: - //## Handle translation of LIFTING_VERTICAL_LEFT member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of LIFTING_VERTICAL_LEFT member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT: - //## Handle translation of LIFTING_VERTICAL_RIGHT member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of LIFTING_VERTICAL_RIGHT member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.REVOLVING: + //## Handle translation of LIFTING_HORIZONTAL member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_LEFT: + //## Handle translation of LIFTING_VERTICAL_LEFT member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.LIFTING_VERTICAL_RIGHT: + //## Handle translation of LIFTING_VERTICAL_RIGHT member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.REVOLVING: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.REVOLVING; case IfcDoorTypeOperationEnum.REVOLVING_VERTICAL: - //## Handle translation of REVOLVING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - //TODO: Handle translation of REVOLVING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType - throw new System.NotImplementedException(); - //## - case IfcDoorTypeOperationEnum.ROLLINGUP: + //## Handle translation of REVOLVING_VERTICAL member from IfcDoorTypeOperationEnum in property OperationType + return this.GetUserDefined(); + //## + case IfcDoorTypeOperationEnum.ROLLINGUP: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.ROLLINGUP; case IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT: return Ifc4.Interfaces.IfcDoorTypeOperationEnum.SINGLE_SWING_LEFT; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDevice.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDevice.cs index 5099075e0..3c2dbad91 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDevice.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDevice.cs @@ -34,29 +34,25 @@ public partial class @IfcElectricFlowStorageDevice : IIfcElectricFlowStorageDevi return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.BATTERY; case IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR: //## Handle translation of CAPACITOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of CAPACITOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK; case IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR: //## Handle translation of COMPENSATOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of COMPENSATOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER; case IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR: //## Handle translation of INDUCTOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of INDUCTOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK; case IfcElectricFlowStorageDeviceTypeEnum.RECHARGER: //## Handle translation of RECHARGER member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of RECHARGER member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.UPS: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.UPS; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDeviceType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDeviceType.cs index 156a66bd2..899040a0d 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDeviceType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElectricFlowStorageDeviceType.cs @@ -34,29 +34,25 @@ Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum IIfcElectricFlowStorageDevi return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.BATTERY; case IfcElectricFlowStorageDeviceTypeEnum.CAPACITOR: //## Handle translation of CAPACITOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of CAPACITOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.CAPACITORBANK; case IfcElectricFlowStorageDeviceTypeEnum.COMPENSATOR: //## Handle translation of COMPENSATOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of COMPENSATOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.HARMONICFILTER; case IfcElectricFlowStorageDeviceTypeEnum.INDUCTOR: //## Handle translation of INDUCTOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of INDUCTOR member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.INDUCTORBANK; case IfcElectricFlowStorageDeviceTypeEnum.RECHARGER: //## Handle translation of RECHARGER member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of RECHARGER member from IfcElectricFlowStorageDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElectricFlowStorageDeviceTypeEnum.UPS: return Ifc4.Interfaces.IfcElectricFlowStorageDeviceTypeEnum.UPS; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssembly.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssembly.cs index a3781a86e..7d2db1b4c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssembly.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssembly.cs @@ -80,8 +80,7 @@ public partial class @IfcElementAssembly : IIfcElementAssembly { case IfcElementAssemblyTypeEnum.ABUTMENT: //## Handle translation of ABUTMENT member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of ABUTMENT member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY; @@ -93,50 +92,41 @@ public partial class @IfcElementAssembly : IIfcElementAssembly return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.BRACED_FRAME; case IfcElementAssemblyTypeEnum.CROSS_BRACING: //## Handle translation of CROSS_BRACING member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of CROSS_BRACING member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.DECK: //## Handle translation of DECK member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of DECK member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.DILATATIONPANEL: //## Handle translation of DILATATIONPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of DILATATIONPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.ENTRANCEWORKS: //## Handle translation of ENTRANCEWORKS member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of ENTRANCEWORKS member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.GIRDER: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.GIRDER; case IfcElementAssemblyTypeEnum.GRID: //## Handle translation of GRID member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of GRID member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.MAST: //## Handle translation of MAST member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of MAST member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.PIER: //## Handle translation of PIER member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of PIER member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.PYLON: //## Handle translation of PYLON member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of PYLON member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY: //## Handle translation of RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT; @@ -144,52 +134,43 @@ public partial class @IfcElementAssembly : IIfcElementAssembly return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.RIGID_FRAME; case IfcElementAssemblyTypeEnum.SHELTER: //## Handle translation of SHELTER member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SHELTER member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SIGNALASSEMBLY: //## Handle translation of SIGNALASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SIGNALASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SLAB_FIELD: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.SLAB_FIELD; case IfcElementAssemblyTypeEnum.SUMPBUSTER: //## Handle translation of SUMPBUSTER member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SUMPBUSTER member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY: //## Handle translation of SUPPORTINGASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SUPPORTINGASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY: //## Handle translation of SUSPENSIONASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SUSPENSIONASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRACKPANEL: //## Handle translation of TRACKPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TRACKPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY: //## Handle translation of TRACTION_SWITCHING_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TRACTION_SWITCHING_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE: //## Handle translation of TRAFFIC_CALMING_DEVICE member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TRAFFIC_CALMING_DEVICE member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRUSS: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.TRUSS; case IfcElementAssemblyTypeEnum.TURNOUTPANEL: //## Handle translation of TURNOUTPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TURNOUTPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssemblyType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssemblyType.cs index a9640cc87..6c4a6f84d 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssemblyType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcElementAssemblyType.cs @@ -32,8 +32,7 @@ Ifc4.Interfaces.IfcElementAssemblyTypeEnum IIfcElementAssemblyType.PredefinedTyp { case IfcElementAssemblyTypeEnum.ABUTMENT: //## Handle translation of ABUTMENT member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of ABUTMENT member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.ACCESSORY_ASSEMBLY; @@ -45,50 +44,41 @@ Ifc4.Interfaces.IfcElementAssemblyTypeEnum IIfcElementAssemblyType.PredefinedTyp return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.BRACED_FRAME; case IfcElementAssemblyTypeEnum.CROSS_BRACING: //## Handle translation of CROSS_BRACING member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of CROSS_BRACING member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.DECK: //## Handle translation of DECK member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of DECK member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.DILATATIONPANEL: //## Handle translation of DILATATIONPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of DILATATIONPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.ENTRANCEWORKS: //## Handle translation of ENTRANCEWORKS member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of ENTRANCEWORKS member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.GIRDER: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.GIRDER; case IfcElementAssemblyTypeEnum.GRID: //## Handle translation of GRID member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of GRID member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.MAST: //## Handle translation of MAST member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of MAST member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.PIER: //## Handle translation of PIER member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of PIER member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.PYLON: //## Handle translation of PYLON member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of PYLON member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY: //## Handle translation of RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of RAIL_MECHANICAL_EQUIPMENT_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.REINFORCEMENT_UNIT; @@ -96,52 +86,43 @@ Ifc4.Interfaces.IfcElementAssemblyTypeEnum IIfcElementAssemblyType.PredefinedTyp return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.RIGID_FRAME; case IfcElementAssemblyTypeEnum.SHELTER: //## Handle translation of SHELTER member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SHELTER member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SIGNALASSEMBLY: //## Handle translation of SIGNALASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SIGNALASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SLAB_FIELD: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.SLAB_FIELD; case IfcElementAssemblyTypeEnum.SUMPBUSTER: //## Handle translation of SUMPBUSTER member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SUMPBUSTER member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SUPPORTINGASSEMBLY: //## Handle translation of SUPPORTINGASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SUPPORTINGASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.SUSPENSIONASSEMBLY: //## Handle translation of SUSPENSIONASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of SUSPENSIONASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRACKPANEL: //## Handle translation of TRACKPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TRACKPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRACTION_SWITCHING_ASSEMBLY: //## Handle translation of TRACTION_SWITCHING_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TRACTION_SWITCHING_ASSEMBLY member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRAFFIC_CALMING_DEVICE: //## Handle translation of TRAFFIC_CALMING_DEVICE member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TRAFFIC_CALMING_DEVICE member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.TRUSS: return Ifc4.Interfaces.IfcElementAssemblyTypeEnum.TRUSS; case IfcElementAssemblyTypeEnum.TURNOUTPANEL: //## Handle translation of TURNOUTPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - //TODO: Handle translation of TURNOUTPANEL member from IfcElementAssemblyTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcElementAssemblyTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminal.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminal.cs index 7532ebe84..50a9a860e 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminal.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminal.cs @@ -36,8 +36,7 @@ public partial class @IfcFireSuppressionTerminal : IIfcFireSuppressionTerminal return Ifc4.Interfaces.IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT; case IfcFireSuppressionTerminalTypeEnum.FIREMONITOR: //## Handle translation of FIREMONITOR member from IfcFireSuppressionTerminalTypeEnum in property PredefinedType - //TODO: Handle translation of FIREMONITOR member from IfcFireSuppressionTerminalTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFireSuppressionTerminalTypeEnum.HOSEREEL: return Ifc4.Interfaces.IfcFireSuppressionTerminalTypeEnum.HOSEREEL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminalType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminalType.cs index 63c26f0c0..93050adfe 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminalType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFireSuppressionTerminalType.cs @@ -36,8 +36,7 @@ Ifc4.Interfaces.IfcFireSuppressionTerminalTypeEnum IIfcFireSuppressionTerminalTy return Ifc4.Interfaces.IfcFireSuppressionTerminalTypeEnum.FIREHYDRANT; case IfcFireSuppressionTerminalTypeEnum.FIREMONITOR: //## Handle translation of FIREMONITOR member from IfcFireSuppressionTerminalTypeEnum in property PredefinedType - //TODO: Handle translation of FIREMONITOR member from IfcFireSuppressionTerminalTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFireSuppressionTerminalTypeEnum.HOSEREEL: return Ifc4.Interfaces.IfcFireSuppressionTerminalTypeEnum.HOSEREEL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrument.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrument.cs index 755aa9833..ba27a7212 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrument.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrument.cs @@ -34,8 +34,7 @@ public partial class @IfcFlowInstrument : IIfcFlowInstrument return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.AMMETER; case IfcFlowInstrumentTypeEnum.COMBINED: //## Handle translation of COMBINED member from IfcFlowInstrumentTypeEnum in property PredefinedType - //TODO: Handle translation of COMBINED member from IfcFlowInstrumentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFlowInstrumentTypeEnum.FREQUENCYMETER: return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.FREQUENCYMETER; @@ -49,8 +48,7 @@ public partial class @IfcFlowInstrument : IIfcFlowInstrument return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.THERMOMETER; case IfcFlowInstrumentTypeEnum.VOLTMETER: //## Handle translation of VOLTMETER member from IfcFlowInstrumentTypeEnum in property PredefinedType - //TODO: Handle translation of VOLTMETER member from IfcFlowInstrumentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK: return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrumentType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrumentType.cs index 270dcdcb2..616c3ab9e 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrumentType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFlowInstrumentType.cs @@ -34,8 +34,7 @@ Ifc4.Interfaces.IfcFlowInstrumentTypeEnum IIfcFlowInstrumentType.PredefinedType return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.AMMETER; case IfcFlowInstrumentTypeEnum.COMBINED: //## Handle translation of COMBINED member from IfcFlowInstrumentTypeEnum in property PredefinedType - //TODO: Handle translation of COMBINED member from IfcFlowInstrumentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFlowInstrumentTypeEnum.FREQUENCYMETER: return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.FREQUENCYMETER; @@ -49,8 +48,7 @@ Ifc4.Interfaces.IfcFlowInstrumentTypeEnum IIfcFlowInstrumentType.PredefinedType return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.THERMOMETER; case IfcFlowInstrumentTypeEnum.VOLTMETER: //## Handle translation of VOLTMETER member from IfcFlowInstrumentTypeEnum in property PredefinedType - //TODO: Handle translation of VOLTMETER member from IfcFlowInstrumentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK: return Ifc4.Interfaces.IfcFlowInstrumentTypeEnum.VOLTMETER_PEAK; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurniture.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurniture.cs index c57431970..29a6f85b9 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurniture.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurniture.cs @@ -46,8 +46,7 @@ public partial class @IfcFurniture : IIfcFurniture return Ifc4.Interfaces.IfcFurnitureTypeEnum.TABLE; case IfcFurnitureTypeEnum.TECHNICALCABINET: //## Handle translation of TECHNICALCABINET member from IfcFurnitureTypeEnum in property PredefinedType - //TODO: Handle translation of TECHNICALCABINET member from IfcFurnitureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFurnitureTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurnitureType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurnitureType.cs index 435c42a18..f8ade6971 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurnitureType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcFurnitureType.cs @@ -88,8 +88,7 @@ Ifc4.Interfaces.IfcAssemblyPlaceEnum IIfcFurnitureType.AssemblyPlace return Ifc4.Interfaces.IfcFurnitureTypeEnum.TABLE; case IfcFurnitureTypeEnum.TECHNICALCABINET: //## Handle translation of TECHNICALCABINET member from IfcFurnitureTypeEnum in property PredefinedType - //TODO: Handle translation of TECHNICALCABINET member from IfcFurnitureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcFurnitureTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElement.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElement.cs index d0c1a60c8..9b7fe9ffa 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElement.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElement.cs @@ -32,15 +32,13 @@ public partial class @IfcGeographicElement : IIfcGeographicElement { case IfcGeographicElementTypeEnum.SOIL_BORING_POINT: //## Handle translation of SOIL_BORING_POINT member from IfcGeographicElementTypeEnum in property PredefinedType - //TODO: Handle translation of SOIL_BORING_POINT member from IfcGeographicElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcGeographicElementTypeEnum.TERRAIN: return Ifc4.Interfaces.IfcGeographicElementTypeEnum.TERRAIN; case IfcGeographicElementTypeEnum.VEGETATION: //## Handle translation of VEGETATION member from IfcGeographicElementTypeEnum in property PredefinedType - //TODO: Handle translation of VEGETATION member from IfcGeographicElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcGeographicElementTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElementType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElementType.cs index 39283df68..ccc80ffa8 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElementType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcGeographicElementType.cs @@ -32,15 +32,13 @@ Ifc4.Interfaces.IfcGeographicElementTypeEnum IIfcGeographicElementType.Predefine { case IfcGeographicElementTypeEnum.SOIL_BORING_POINT: //## Handle translation of SOIL_BORING_POINT member from IfcGeographicElementTypeEnum in property PredefinedType - //TODO: Handle translation of SOIL_BORING_POINT member from IfcGeographicElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcGeographicElementTypeEnum.TERRAIN: return Ifc4.Interfaces.IfcGeographicElementTypeEnum.TERRAIN; case IfcGeographicElementTypeEnum.VEGETATION: //## Handle translation of VEGETATION member from IfcGeographicElementTypeEnum in property PredefinedType - //TODO: Handle translation of VEGETATION member from IfcGeographicElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcGeographicElementTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchanger.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchanger.cs index 57d9ca254..e1ec30071 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchanger.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchanger.cs @@ -36,8 +36,7 @@ public partial class @IfcHeatExchanger : IIfcHeatExchanger return Ifc4.Interfaces.IfcHeatExchangerTypeEnum.SHELLANDTUBE; case IfcHeatExchangerTypeEnum.TURNOUTHEATING: //## Handle translation of TURNOUTHEATING member from IfcHeatExchangerTypeEnum in property PredefinedType - //TODO: Handle translation of TURNOUTHEATING member from IfcHeatExchangerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcHeatExchangerTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchangerType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchangerType.cs index dd73f8e26..d697aef18 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchangerType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcHeatExchangerType.cs @@ -36,8 +36,7 @@ Ifc4.Interfaces.IfcHeatExchangerTypeEnum IIfcHeatExchangerType.PredefinedType return Ifc4.Interfaces.IfcHeatExchangerTypeEnum.SHELLANDTUBE; case IfcHeatExchangerTypeEnum.TURNOUTHEATING: //## Handle translation of TURNOUTHEATING member from IfcHeatExchangerTypeEnum in property PredefinedType - //TODO: Handle translation of TURNOUTHEATING member from IfcHeatExchangerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcHeatExchangerTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastener.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastener.cs index a3e2fca65..12af6c54f 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastener.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastener.cs @@ -70,13 +70,11 @@ public partial class @IfcMechanicalFastener : IIfcMechanicalFastener return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.BOLT; case IfcMechanicalFastenerTypeEnum.CHAIN: //## Handle translation of CHAIN member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of CHAIN member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.COUPLER: //## Handle translation of COUPLER member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of COUPLER member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.DOWEL: return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.DOWEL; @@ -86,20 +84,17 @@ public partial class @IfcMechanicalFastener : IIfcMechanicalFastener return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.NAILPLATE; case IfcMechanicalFastenerTypeEnum.RAILFASTENING: //## Handle translation of RAILFASTENING member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of RAILFASTENING member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.RAILJOINT: //## Handle translation of RAILJOINT member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of RAILJOINT member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.RIVET: return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.RIVET; case IfcMechanicalFastenerTypeEnum.ROPE: //## Handle translation of ROPE member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of ROPE member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.SCREW: return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.SCREW; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastenerType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastenerType.cs index fa0a0191a..b89731177 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastenerType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMechanicalFastenerType.cs @@ -36,13 +36,11 @@ Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum IIfcMechanicalFastenerType.Predefi return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.BOLT; case IfcMechanicalFastenerTypeEnum.CHAIN: //## Handle translation of CHAIN member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of CHAIN member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.COUPLER: //## Handle translation of COUPLER member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of COUPLER member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.DOWEL: return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.DOWEL; @@ -52,20 +50,17 @@ Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum IIfcMechanicalFastenerType.Predefi return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.NAILPLATE; case IfcMechanicalFastenerTypeEnum.RAILFASTENING: //## Handle translation of RAILFASTENING member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of RAILFASTENING member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.RAILJOINT: //## Handle translation of RAILJOINT member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of RAILJOINT member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.RIVET: return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.RIVET; case IfcMechanicalFastenerTypeEnum.ROPE: //## Handle translation of ROPE member from IfcMechanicalFastenerTypeEnum in property PredefinedType - //TODO: Handle translation of ROPE member from IfcMechanicalFastenerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMechanicalFastenerTypeEnum.SCREW: return Ifc4.Interfaces.IfcMechanicalFastenerTypeEnum.SCREW; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMember.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMember.cs index c4f1181dc..dbefe9ac9 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMember.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMember.cs @@ -32,8 +32,7 @@ public partial class @IfcMember : IIfcMember { case IfcMemberTypeEnum.ARCH_SEGMENT: //## Handle translation of ARCH_SEGMENT member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of ARCH_SEGMENT member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.BRACE: return Ifc4.Interfaces.IfcMemberTypeEnum.BRACE; @@ -55,20 +54,17 @@ public partial class @IfcMember : IIfcMember return Ifc4.Interfaces.IfcMemberTypeEnum.RAFTER; case IfcMemberTypeEnum.STAY_CABLE: //## Handle translation of STAY_CABLE member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of STAY_CABLE member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.STIFFENING_RIB: //## Handle translation of STIFFENING_RIB member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of STIFFENING_RIB member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.STRINGER: return Ifc4.Interfaces.IfcMemberTypeEnum.STRINGER; case IfcMemberTypeEnum.STRUCTURALCABLE: //## Handle translation of STRUCTURALCABLE member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of STRUCTURALCABLE member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.STRUT: return Ifc4.Interfaces.IfcMemberTypeEnum.STRUT; @@ -76,18 +72,15 @@ public partial class @IfcMember : IIfcMember return Ifc4.Interfaces.IfcMemberTypeEnum.STUD; case IfcMemberTypeEnum.SUSPENDER: //## Handle translation of SUSPENDER member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of SUSPENDER member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.SUSPENSION_CABLE: //## Handle translation of SUSPENSION_CABLE member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of SUSPENSION_CABLE member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.TIEBAR: //## Handle translation of TIEBAR member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of TIEBAR member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMemberType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMemberType.cs index d3528052d..165ddfba7 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcMemberType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcMemberType.cs @@ -32,8 +32,7 @@ Ifc4.Interfaces.IfcMemberTypeEnum IIfcMemberType.PredefinedType { case IfcMemberTypeEnum.ARCH_SEGMENT: //## Handle translation of ARCH_SEGMENT member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of ARCH_SEGMENT member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.BRACE: return Ifc4.Interfaces.IfcMemberTypeEnum.BRACE; @@ -55,20 +54,17 @@ Ifc4.Interfaces.IfcMemberTypeEnum IIfcMemberType.PredefinedType return Ifc4.Interfaces.IfcMemberTypeEnum.RAFTER; case IfcMemberTypeEnum.STAY_CABLE: //## Handle translation of STAY_CABLE member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of STAY_CABLE member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.STIFFENING_RIB: //## Handle translation of STIFFENING_RIB member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of STIFFENING_RIB member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.STRINGER: return Ifc4.Interfaces.IfcMemberTypeEnum.STRINGER; case IfcMemberTypeEnum.STRUCTURALCABLE: //## Handle translation of STRUCTURALCABLE member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of STRUCTURALCABLE member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.STRUT: return Ifc4.Interfaces.IfcMemberTypeEnum.STRUT; @@ -76,18 +72,15 @@ Ifc4.Interfaces.IfcMemberTypeEnum IIfcMemberType.PredefinedType return Ifc4.Interfaces.IfcMemberTypeEnum.STUD; case IfcMemberTypeEnum.SUSPENDER: //## Handle translation of SUSPENDER member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of SUSPENDER member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.SUSPENSION_CABLE: //## Handle translation of SUSPENSION_CABLE member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of SUSPENSION_CABLE member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.TIEBAR: //## Handle translation of TIEBAR member from IfcMemberTypeEnum in property PredefinedType - //TODO: Handle translation of TIEBAR member from IfcMemberTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcMemberTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlate.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlate.cs index 6daa6bb98..81da99112 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlate.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlate.cs @@ -32,42 +32,35 @@ public partial class @IfcPlate : IIfcPlate { case IfcPlateTypeEnum.BASE_PLATE: //## Handle translation of BASE_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of BASE_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.COVER_PLATE: //## Handle translation of COVER_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of COVER_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.CURTAIN_PANEL: return Ifc4.Interfaces.IfcPlateTypeEnum.CURTAIN_PANEL; case IfcPlateTypeEnum.FLANGE_PLATE: //## Handle translation of FLANGE_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of FLANGE_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.GUSSET_PLATE: //## Handle translation of GUSSET_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of GUSSET_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.SHEET: return Ifc4.Interfaces.IfcPlateTypeEnum.SHEET; case IfcPlateTypeEnum.SPLICE_PLATE: //## Handle translation of SPLICE_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of SPLICE_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.STIFFENER_PLATE: //## Handle translation of STIFFENER_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of STIFFENER_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.WEB_PLATE: //## Handle translation of WEB_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of WEB_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlateType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlateType.cs index 94cdceba3..de2b659a8 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlateType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcPlateType.cs @@ -32,42 +32,35 @@ Ifc4.Interfaces.IfcPlateTypeEnum IIfcPlateType.PredefinedType { case IfcPlateTypeEnum.BASE_PLATE: //## Handle translation of BASE_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of BASE_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.COVER_PLATE: //## Handle translation of COVER_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of COVER_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.CURTAIN_PANEL: return Ifc4.Interfaces.IfcPlateTypeEnum.CURTAIN_PANEL; case IfcPlateTypeEnum.FLANGE_PLATE: //## Handle translation of FLANGE_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of FLANGE_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.GUSSET_PLATE: //## Handle translation of GUSSET_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of GUSSET_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.SHEET: return Ifc4.Interfaces.IfcPlateTypeEnum.SHEET; case IfcPlateTypeEnum.SPLICE_PLATE: //## Handle translation of SPLICE_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of SPLICE_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.STIFFENER_PLATE: //## Handle translation of STIFFENER_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of STIFFENER_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.WEB_PLATE: //## Handle translation of WEB_PLATE member from IfcPlateTypeEnum in property PredefinedType - //TODO: Handle translation of WEB_PLATE member from IfcPlateTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcPlateTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcProjectionElement.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcProjectionElement.cs index 7ea5d4a19..027613d07 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcProjectionElement.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcProjectionElement.cs @@ -32,13 +32,11 @@ public partial class @IfcProjectionElement : IIfcProjectionElement { case IfcProjectionElementTypeEnum.BLISTER: //## Handle translation of BLISTER member from IfcProjectionElementTypeEnum in property PredefinedType - //TODO: Handle translation of BLISTER member from IfcProjectionElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProjectionElementTypeEnum.DEVIATOR: //## Handle translation of DEVIATOR member from IfcProjectionElementTypeEnum in property PredefinedType - //TODO: Handle translation of DEVIATOR member from IfcProjectionElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProjectionElementTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDevice.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDevice.cs index 866e1c46f..5e1704783 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDevice.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDevice.cs @@ -32,8 +32,7 @@ public partial class @IfcProtectiveDevice : IIfcProtectiveDevice { case IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE: //## Handle translation of ANTI_ARCING_DEVICE member from IfcProtectiveDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of ANTI_ARCING_DEVICE member from IfcProtectiveDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER: return Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER; @@ -49,15 +48,13 @@ public partial class @IfcProtectiveDevice : IIfcProtectiveDevice return Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH; case IfcProtectiveDeviceTypeEnum.SPARKGAP: //## Handle translation of SPARKGAP member from IfcProtectiveDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of SPARKGAP member from IfcProtectiveDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProtectiveDeviceTypeEnum.VARISTOR: return Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum.VARISTOR; case IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER: //## Handle translation of VOLTAGELIMITER member from IfcProtectiveDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of VOLTAGELIMITER member from IfcProtectiveDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProtectiveDeviceTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDeviceType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDeviceType.cs index c0c23ea55..fd3abb492 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDeviceType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcProtectiveDeviceType.cs @@ -32,8 +32,7 @@ Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum IIfcProtectiveDeviceType.PredefinedT { case IfcProtectiveDeviceTypeEnum.ANTI_ARCING_DEVICE: //## Handle translation of ANTI_ARCING_DEVICE member from IfcProtectiveDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of ANTI_ARCING_DEVICE member from IfcProtectiveDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER: return Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum.CIRCUITBREAKER; @@ -49,15 +48,13 @@ Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum IIfcProtectiveDeviceType.PredefinedT return Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum.RESIDUALCURRENTSWITCH; case IfcProtectiveDeviceTypeEnum.SPARKGAP: //## Handle translation of SPARKGAP member from IfcProtectiveDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of SPARKGAP member from IfcProtectiveDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProtectiveDeviceTypeEnum.VARISTOR: return Ifc4.Interfaces.IfcProtectiveDeviceTypeEnum.VARISTOR; case IfcProtectiveDeviceTypeEnum.VOLTAGELIMITER: //## Handle translation of VOLTAGELIMITER member from IfcProtectiveDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of VOLTAGELIMITER member from IfcProtectiveDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcProtectiveDeviceTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailing.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailing.cs index cc1762a84..46753e17a 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailing.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailing.cs @@ -34,8 +34,7 @@ public partial class @IfcRailing : IIfcRailing return Ifc4.Interfaces.IfcRailingTypeEnum.BALUSTRADE; case IfcRailingTypeEnum.FENCE: //## Handle translation of FENCE member from IfcRailingTypeEnum in property PredefinedType - //TODO: Handle translation of FENCE member from IfcRailingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcRailingTypeEnum.GUARDRAIL: return Ifc4.Interfaces.IfcRailingTypeEnum.GUARDRAIL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailingType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailingType.cs index b60c6e86a..2f31ed838 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailingType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRailingType.cs @@ -34,8 +34,7 @@ Ifc4.Interfaces.IfcRailingTypeEnum IIfcRailingType.PredefinedType return Ifc4.Interfaces.IfcRailingTypeEnum.BALUSTRADE; case IfcRailingTypeEnum.FENCE: //## Handle translation of FENCE member from IfcRailingTypeEnum in property PredefinedType - //TODO: Handle translation of FENCE member from IfcRailingTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcRailingTypeEnum.GUARDRAIL: return Ifc4.Interfaces.IfcRailingTypeEnum.GUARDRAIL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBar.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBar.cs index 72c57ec80..c013f1b0e 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBar.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBar.cs @@ -97,8 +97,7 @@ public partial class @IfcReinforcingBar : IIfcReinforcingBar return Ifc4.Interfaces.IfcReinforcingBarTypeEnum.SHEAR; case IfcReinforcingBarTypeEnum.SPACEBAR: //## Handle translation of SPACEBAR member from IfcReinforcingBarTypeEnum in property PredefinedType - //TODO: Handle translation of SPACEBAR member from IfcReinforcingBarTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReinforcingBarTypeEnum.STUD: return Ifc4.Interfaces.IfcReinforcingBarTypeEnum.STUD; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBarType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBarType.cs index d5ee7b0b4..758e4a2d8 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBarType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcReinforcingBarType.cs @@ -46,8 +46,7 @@ Ifc4.Interfaces.IfcReinforcingBarTypeEnum IIfcReinforcingBarType.PredefinedType return Ifc4.Interfaces.IfcReinforcingBarTypeEnum.SHEAR; case IfcReinforcingBarTypeEnum.SPACEBAR: //## Handle translation of SPACEBAR member from IfcReinforcingBarTypeEnum in property PredefinedType - //TODO: Handle translation of SPACEBAR member from IfcReinforcingBarTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReinforcingBarTypeEnum.STUD: return Ifc4.Interfaces.IfcReinforcingBarTypeEnum.STUD; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensor.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensor.cs index 9f97d0102..e29322b5c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensor.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensor.cs @@ -40,8 +40,7 @@ public partial class @IfcSensor : IIfcSensor return Ifc4.Interfaces.IfcSensorTypeEnum.COSENSOR; case IfcSensorTypeEnum.EARTHQUAKESENSOR: //## Handle translation of EARTHQUAKESENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of EARTHQUAKESENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.FIRESENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.FIRESENSOR; @@ -49,8 +48,7 @@ public partial class @IfcSensor : IIfcSensor return Ifc4.Interfaces.IfcSensorTypeEnum.FLOWSENSOR; case IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR: //## Handle translation of FOREIGNOBJECTDETECTIONSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of FOREIGNOBJECTDETECTIONSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.FROSTSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.FROSTSENSOR; @@ -74,8 +72,7 @@ public partial class @IfcSensor : IIfcSensor return Ifc4.Interfaces.IfcSensorTypeEnum.MOVEMENTSENSOR; case IfcSensorTypeEnum.OBSTACLESENSOR: //## Handle translation of OBSTACLESENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of OBSTACLESENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.PHSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.PHSENSOR; @@ -87,15 +84,13 @@ public partial class @IfcSensor : IIfcSensor return Ifc4.Interfaces.IfcSensorTypeEnum.RADIOACTIVITYSENSOR; case IfcSensorTypeEnum.RAINSENSOR: //## Handle translation of RAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of RAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.SMOKESENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.SMOKESENSOR; case IfcSensorTypeEnum.SNOWDEPTHSENSOR: //## Handle translation of SNOWDEPTHSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of SNOWDEPTHSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.SOUNDSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.SOUNDSENSOR; @@ -103,18 +98,15 @@ public partial class @IfcSensor : IIfcSensor return Ifc4.Interfaces.IfcSensorTypeEnum.TEMPERATURESENSOR; case IfcSensorTypeEnum.TRAINSENSOR: //## Handle translation of TRAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of TRAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.TURNOUTCLOSURESENSOR: //## Handle translation of TURNOUTCLOSURESENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of TURNOUTCLOSURESENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.WHEELSENSOR: //## Handle translation of WHEELSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of WHEELSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.WINDSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.WINDSENSOR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensorType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensorType.cs index 0290d65c2..5abe29398 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensorType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSensorType.cs @@ -40,8 +40,7 @@ Ifc4.Interfaces.IfcSensorTypeEnum IIfcSensorType.PredefinedType return Ifc4.Interfaces.IfcSensorTypeEnum.COSENSOR; case IfcSensorTypeEnum.EARTHQUAKESENSOR: //## Handle translation of EARTHQUAKESENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of EARTHQUAKESENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.FIRESENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.FIRESENSOR; @@ -49,8 +48,7 @@ Ifc4.Interfaces.IfcSensorTypeEnum IIfcSensorType.PredefinedType return Ifc4.Interfaces.IfcSensorTypeEnum.FLOWSENSOR; case IfcSensorTypeEnum.FOREIGNOBJECTDETECTIONSENSOR: //## Handle translation of FOREIGNOBJECTDETECTIONSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of FOREIGNOBJECTDETECTIONSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.FROSTSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.FROSTSENSOR; @@ -74,8 +72,7 @@ Ifc4.Interfaces.IfcSensorTypeEnum IIfcSensorType.PredefinedType return Ifc4.Interfaces.IfcSensorTypeEnum.MOVEMENTSENSOR; case IfcSensorTypeEnum.OBSTACLESENSOR: //## Handle translation of OBSTACLESENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of OBSTACLESENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.PHSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.PHSENSOR; @@ -87,15 +84,13 @@ Ifc4.Interfaces.IfcSensorTypeEnum IIfcSensorType.PredefinedType return Ifc4.Interfaces.IfcSensorTypeEnum.RADIOACTIVITYSENSOR; case IfcSensorTypeEnum.RAINSENSOR: //## Handle translation of RAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of RAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.SMOKESENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.SMOKESENSOR; case IfcSensorTypeEnum.SNOWDEPTHSENSOR: //## Handle translation of SNOWDEPTHSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of SNOWDEPTHSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.SOUNDSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.SOUNDSENSOR; @@ -103,18 +98,15 @@ Ifc4.Interfaces.IfcSensorTypeEnum IIfcSensorType.PredefinedType return Ifc4.Interfaces.IfcSensorTypeEnum.TEMPERATURESENSOR; case IfcSensorTypeEnum.TRAINSENSOR: //## Handle translation of TRAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of TRAINSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.TURNOUTCLOSURESENSOR: //## Handle translation of TURNOUTCLOSURESENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of TURNOUTCLOSURESENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.WHEELSENSOR: //## Handle translation of WHEELSENSOR member from IfcSensorTypeEnum in property PredefinedType - //TODO: Handle translation of WHEELSENSOR member from IfcSensorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSensorTypeEnum.WINDSENSOR: return Ifc4.Interfaces.IfcSensorTypeEnum.WINDSENSOR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlab.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlab.cs index 068c886e5..c7e7e750e 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlab.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlab.cs @@ -32,8 +32,7 @@ public partial class @IfcSlab : IIfcSlab { case IfcSlabTypeEnum.APPROACH_SLAB: //## Handle translation of APPROACH_SLAB member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of APPROACH_SLAB member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.BASESLAB: return Ifc4.Interfaces.IfcSlabTypeEnum.BASESLAB; @@ -43,25 +42,21 @@ public partial class @IfcSlab : IIfcSlab return Ifc4.Interfaces.IfcSlabTypeEnum.LANDING; case IfcSlabTypeEnum.PAVING: //## Handle translation of PAVING member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of PAVING member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.ROOF: return Ifc4.Interfaces.IfcSlabTypeEnum.ROOF; case IfcSlabTypeEnum.SIDEWALK: //## Handle translation of SIDEWALK member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of SIDEWALK member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.TRACKSLAB: //## Handle translation of TRACKSLAB member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of TRACKSLAB member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.WEARING: //## Handle translation of WEARING member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of WEARING member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlabType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlabType.cs index 7dc932050..b399957c2 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlabType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSlabType.cs @@ -32,8 +32,7 @@ Ifc4.Interfaces.IfcSlabTypeEnum IIfcSlabType.PredefinedType { case IfcSlabTypeEnum.APPROACH_SLAB: //## Handle translation of APPROACH_SLAB member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of APPROACH_SLAB member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.BASESLAB: return Ifc4.Interfaces.IfcSlabTypeEnum.BASESLAB; @@ -43,25 +42,21 @@ Ifc4.Interfaces.IfcSlabTypeEnum IIfcSlabType.PredefinedType return Ifc4.Interfaces.IfcSlabTypeEnum.LANDING; case IfcSlabTypeEnum.PAVING: //## Handle translation of PAVING member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of PAVING member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.ROOF: return Ifc4.Interfaces.IfcSlabTypeEnum.ROOF; case IfcSlabTypeEnum.SIDEWALK: //## Handle translation of SIDEWALK member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of SIDEWALK member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.TRACKSLAB: //## Handle translation of TRACKSLAB member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of TRACKSLAB member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.WEARING: //## Handle translation of WEARING member from IfcSlabTypeEnum in property PredefinedType - //TODO: Handle translation of WEARING member from IfcSlabTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSlabTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpace.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpace.cs index cd1ac0ba3..d8318deba 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpace.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpace.cs @@ -32,8 +32,7 @@ public partial class @IfcSpace : IIfcSpace { case IfcSpaceTypeEnum.BERTH: //## Handle translation of BERTH member from IfcSpaceTypeEnum in property PredefinedType - //TODO: Handle translation of BERTH member from IfcSpaceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSpaceTypeEnum.EXTERNAL: return Ifc4.Interfaces.IfcSpaceTypeEnum.EXTERNAL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpaceType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpaceType.cs index ee7b56020..9d55e2c73 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpaceType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpaceType.cs @@ -32,8 +32,7 @@ Ifc4.Interfaces.IfcSpaceTypeEnum IIfcSpaceType.PredefinedType { case IfcSpaceTypeEnum.BERTH: //## Handle translation of BERTH member from IfcSpaceTypeEnum in property PredefinedType - //TODO: Handle translation of BERTH member from IfcSpaceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSpaceTypeEnum.EXTERNAL: return Ifc4.Interfaces.IfcSpaceTypeEnum.EXTERNAL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZone.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZone.cs index ed9196969..3bb542241 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZone.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZone.cs @@ -36,8 +36,7 @@ public partial class @IfcSpatialZone : IIfcSpatialZone return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.FIRESAFETY; case IfcSpatialZoneTypeEnum.INTERFERENCE: //## Handle translation of INTERFERENCE member from IfcSpatialZoneTypeEnum in property PredefinedType - //TODO: Handle translation of INTERFERENCE member from IfcSpatialZoneTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSpatialZoneTypeEnum.LIGHTING: return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.LIGHTING; @@ -45,8 +44,7 @@ public partial class @IfcSpatialZone : IIfcSpatialZone return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.OCCUPANCY; case IfcSpatialZoneTypeEnum.RESERVATION: //## Handle translation of RESERVATION member from IfcSpatialZoneTypeEnum in property PredefinedType - //TODO: Handle translation of RESERVATION member from IfcSpatialZoneTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSpatialZoneTypeEnum.SECURITY: return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.SECURITY; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZoneType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZoneType.cs index 1ce2f9873..f36bda14c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZoneType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSpatialZoneType.cs @@ -36,8 +36,7 @@ Ifc4.Interfaces.IfcSpatialZoneTypeEnum IIfcSpatialZoneType.PredefinedType return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.FIRESAFETY; case IfcSpatialZoneTypeEnum.INTERFERENCE: //## Handle translation of INTERFERENCE member from IfcSpatialZoneTypeEnum in property PredefinedType - //TODO: Handle translation of INTERFERENCE member from IfcSpatialZoneTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSpatialZoneTypeEnum.LIGHTING: return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.LIGHTING; @@ -45,8 +44,7 @@ Ifc4.Interfaces.IfcSpatialZoneTypeEnum IIfcSpatialZoneType.PredefinedType return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.OCCUPANCY; case IfcSpatialZoneTypeEnum.RESERVATION: //## Handle translation of RESERVATION member from IfcSpatialZoneTypeEnum in property PredefinedType - //TODO: Handle translation of RESERVATION member from IfcSpatialZoneTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSpatialZoneTypeEnum.SECURITY: return Ifc4.Interfaces.IfcSpatialZoneTypeEnum.SECURITY; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcStair.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcStair.cs index bde3a52bc..7ec333fad 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcStair.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcStair.cs @@ -40,8 +40,7 @@ public partial class @IfcStair : IIfcStair return Ifc4.Interfaces.IfcStairTypeEnum.HALF_WINDING_STAIR; case IfcStairTypeEnum.LADDER: //## Handle translation of LADDER member from IfcStairTypeEnum in property PredefinedType - //TODO: Handle translation of LADDER member from IfcStairTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcStairTypeEnum.QUARTER_TURN_STAIR: return Ifc4.Interfaces.IfcStairTypeEnum.QUARTER_TURN_STAIR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcStairType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcStairType.cs index f02d24423..f421424ed 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcStairType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcStairType.cs @@ -40,8 +40,7 @@ Ifc4.Interfaces.IfcStairTypeEnum IIfcStairType.PredefinedType return Ifc4.Interfaces.IfcStairTypeEnum.HALF_WINDING_STAIR; case IfcStairTypeEnum.LADDER: //## Handle translation of LADDER member from IfcStairTypeEnum in property PredefinedType - //TODO: Handle translation of LADDER member from IfcStairTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcStairTypeEnum.QUARTER_TURN_STAIR: return Ifc4.Interfaces.IfcStairTypeEnum.QUARTER_TURN_STAIR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSurfaceFeature.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSurfaceFeature.cs index 40769e41e..a236d93f3 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSurfaceFeature.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSurfaceFeature.cs @@ -32,47 +32,39 @@ public partial class @IfcSurfaceFeature : IIfcSurfaceFeature { case IfcSurfaceFeatureTypeEnum.DEFECT: //## Handle translation of DEFECT member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of DEFECT member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.HATCHMARKING: //## Handle translation of HATCHMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of HATCHMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.LINEMARKING: //## Handle translation of LINEMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of LINEMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.MARK: return Ifc4.Interfaces.IfcSurfaceFeatureTypeEnum.MARK; case IfcSurfaceFeatureTypeEnum.NONSKIDSURFACING: //## Handle translation of NONSKIDSURFACING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of NONSKIDSURFACING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.PAVEMENTSURFACEMARKING: //## Handle translation of PAVEMENTSURFACEMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of PAVEMENTSURFACEMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.RUMBLESTRIP: //## Handle translation of RUMBLESTRIP member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of RUMBLESTRIP member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.SYMBOLMARKING: //## Handle translation of SYMBOLMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of SYMBOLMARKING member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.TAG: return Ifc4.Interfaces.IfcSurfaceFeatureTypeEnum.TAG; case IfcSurfaceFeatureTypeEnum.TRANSVERSERUMBLESTRIP: //## Handle translation of TRANSVERSERUMBLESTRIP member from IfcSurfaceFeatureTypeEnum in property PredefinedType - //TODO: Handle translation of TRANSVERSERUMBLESTRIP member from IfcSurfaceFeatureTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSurfaceFeatureTypeEnum.TREATMENT: return Ifc4.Interfaces.IfcSurfaceFeatureTypeEnum.TREATMENT; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDevice.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDevice.cs index d4d5d1184..0b58ce9a9 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDevice.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDevice.cs @@ -42,8 +42,7 @@ public partial class @IfcSwitchingDevice : IIfcSwitchingDevice return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH; case IfcSwitchingDeviceTypeEnum.RELAY: //## Handle translation of RELAY member from IfcSwitchingDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of RELAY member from IfcSwitchingDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSwitchingDeviceTypeEnum.SELECTORSWITCH: return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.SELECTORSWITCH; @@ -51,8 +50,7 @@ public partial class @IfcSwitchingDevice : IIfcSwitchingDevice return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.STARTER; case IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT: //## Handle translation of START_AND_STOP_EQUIPMENT member from IfcSwitchingDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of START_AND_STOP_EQUIPMENT member from IfcSwitchingDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR: return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDeviceType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDeviceType.cs index e9c553873..0a89d937e 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDeviceType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSwitchingDeviceType.cs @@ -42,8 +42,7 @@ Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum IIfcSwitchingDeviceType.PredefinedTyp return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.MOMENTARYSWITCH; case IfcSwitchingDeviceTypeEnum.RELAY: //## Handle translation of RELAY member from IfcSwitchingDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of RELAY member from IfcSwitchingDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSwitchingDeviceTypeEnum.SELECTORSWITCH: return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.SELECTORSWITCH; @@ -51,8 +50,7 @@ Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum IIfcSwitchingDeviceType.PredefinedTyp return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.STARTER; case IfcSwitchingDeviceTypeEnum.START_AND_STOP_EQUIPMENT: //## Handle translation of START_AND_STOP_EQUIPMENT member from IfcSwitchingDeviceTypeEnum in property PredefinedType - //TODO: Handle translation of START_AND_STOP_EQUIPMENT member from IfcSwitchingDeviceTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR: return Ifc4.Interfaces.IfcSwitchingDeviceTypeEnum.SWITCHDISCONNECTOR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElement.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElement.cs index 049d4a7b2..ee1941904 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElement.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElement.cs @@ -34,8 +34,7 @@ public partial class @IfcSystemFurnitureElement : IIfcSystemFurnitureElement return Ifc4.Interfaces.IfcSystemFurnitureElementTypeEnum.PANEL; case IfcSystemFurnitureElementTypeEnum.SUBRACK: //## Handle translation of SUBRACK member from IfcSystemFurnitureElementTypeEnum in property PredefinedType - //TODO: Handle translation of SUBRACK member from IfcSystemFurnitureElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSystemFurnitureElementTypeEnum.WORKSURFACE: return Ifc4.Interfaces.IfcSystemFurnitureElementTypeEnum.WORKSURFACE; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElementType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElementType.cs index dc263ad52..5931d03d5 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElementType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcSystemFurnitureElementType.cs @@ -34,8 +34,7 @@ public partial class @IfcSystemFurnitureElementType : IIfcSystemFurnitureElement return Ifc4.Interfaces.IfcSystemFurnitureElementTypeEnum.PANEL; case IfcSystemFurnitureElementTypeEnum.SUBRACK: //## Handle translation of SUBRACK member from IfcSystemFurnitureElementTypeEnum in property PredefinedType - //TODO: Handle translation of SUBRACK member from IfcSystemFurnitureElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcSystemFurnitureElementTypeEnum.WORKSURFACE: return Ifc4.Interfaces.IfcSystemFurnitureElementTypeEnum.WORKSURFACE; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTank.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTank.cs index 04443cca1..0302af859 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTank.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTank.cs @@ -40,8 +40,7 @@ public partial class @IfcTank : IIfcTank return Ifc4.Interfaces.IfcTankTypeEnum.FEEDANDEXPANSION; case IfcTankTypeEnum.OILRETENTIONTRAY: //## Handle translation of OILRETENTIONTRAY member from IfcTankTypeEnum in property PredefinedType - //TODO: Handle translation of OILRETENTIONTRAY member from IfcTankTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTankTypeEnum.PRESSUREVESSEL: return Ifc4.Interfaces.IfcTankTypeEnum.PRESSUREVESSEL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTankType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTankType.cs index e5e8607f8..ba93074a2 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTankType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTankType.cs @@ -40,8 +40,7 @@ Ifc4.Interfaces.IfcTankTypeEnum IIfcTankType.PredefinedType return Ifc4.Interfaces.IfcTankTypeEnum.FEEDANDEXPANSION; case IfcTankTypeEnum.OILRETENTIONTRAY: //## Handle translation of OILRETENTIONTRAY member from IfcTankTypeEnum in property PredefinedType - //TODO: Handle translation of OILRETENTIONTRAY member from IfcTankTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTankTypeEnum.PRESSUREVESSEL: return Ifc4.Interfaces.IfcTankTypeEnum.PRESSUREVESSEL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTask.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTask.cs index c91115a9d..c309bc1fe 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTask.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTask.cs @@ -111,15 +111,13 @@ IIfcTaskTime IIfcTask.TaskTime { case IfcTaskTypeEnum.ADJUSTMENT: //## Handle translation of ADJUSTMENT member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of ADJUSTMENT member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.ATTENDANCE: return Ifc4.Interfaces.IfcTaskTypeEnum.ATTENDANCE; case IfcTaskTypeEnum.CALIBRATION: //## Handle translation of CALIBRATION member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of CALIBRATION member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.CONSTRUCTION: return Ifc4.Interfaces.IfcTaskTypeEnum.CONSTRUCTION; @@ -131,13 +129,11 @@ IIfcTaskTime IIfcTask.TaskTime return Ifc4.Interfaces.IfcTaskTypeEnum.DISPOSAL; case IfcTaskTypeEnum.EMERGENCY: //## Handle translation of EMERGENCY member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of EMERGENCY member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.INSPECTION: //## Handle translation of INSPECTION member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of INSPECTION member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.INSTALLATION: return Ifc4.Interfaces.IfcTaskTypeEnum.INSTALLATION; @@ -155,28 +151,23 @@ IIfcTaskTime IIfcTask.TaskTime return Ifc4.Interfaces.IfcTaskTypeEnum.RENOVATION; case IfcTaskTypeEnum.SAFETY: //## Handle translation of SAFETY member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of SAFETY member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.SHUTDOWN: //## Handle translation of SHUTDOWN member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of SHUTDOWN member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.STARTUP: //## Handle translation of STARTUP member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of STARTUP member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.TESTING: //## Handle translation of TESTING member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of TESTING member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.TROUBLESHOOTING: //## Handle translation of TROUBLESHOOTING member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of TROUBLESHOOTING member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTaskType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTaskType.cs index 7ed245af5..d0479771c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTaskType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTaskType.cs @@ -32,15 +32,13 @@ Ifc4.Interfaces.IfcTaskTypeEnum IIfcTaskType.PredefinedType { case IfcTaskTypeEnum.ADJUSTMENT: //## Handle translation of ADJUSTMENT member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of ADJUSTMENT member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.ATTENDANCE: return Ifc4.Interfaces.IfcTaskTypeEnum.ATTENDANCE; case IfcTaskTypeEnum.CALIBRATION: //## Handle translation of CALIBRATION member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of CALIBRATION member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.CONSTRUCTION: return Ifc4.Interfaces.IfcTaskTypeEnum.CONSTRUCTION; @@ -52,13 +50,11 @@ Ifc4.Interfaces.IfcTaskTypeEnum IIfcTaskType.PredefinedType return Ifc4.Interfaces.IfcTaskTypeEnum.DISPOSAL; case IfcTaskTypeEnum.EMERGENCY: //## Handle translation of EMERGENCY member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of EMERGENCY member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.INSPECTION: //## Handle translation of INSPECTION member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of INSPECTION member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.INSTALLATION: return Ifc4.Interfaces.IfcTaskTypeEnum.INSTALLATION; @@ -76,28 +72,23 @@ Ifc4.Interfaces.IfcTaskTypeEnum IIfcTaskType.PredefinedType return Ifc4.Interfaces.IfcTaskTypeEnum.RENOVATION; case IfcTaskTypeEnum.SAFETY: //## Handle translation of SAFETY member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of SAFETY member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.SHUTDOWN: //## Handle translation of SHUTDOWN member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of SHUTDOWN member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.STARTUP: //## Handle translation of STARTUP member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of STARTUP member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.TESTING: //## Handle translation of TESTING member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of TESTING member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.TROUBLESHOOTING: //## Handle translation of TROUBLESHOOTING member from IfcTaskTypeEnum in property PredefinedType - //TODO: Handle translation of TROUBLESHOOTING member from IfcTaskTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTaskTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformer.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformer.cs index 9037ea4a9..780ba70a7 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformer.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformer.cs @@ -32,13 +32,11 @@ public partial class @IfcTransformer : IIfcTransformer { case IfcTransformerTypeEnum.CHOPPER: //## Handle translation of CHOPPER member from IfcTransformerTypeEnum in property PredefinedType - //TODO: Handle translation of CHOPPER member from IfcTransformerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTransformerTypeEnum.COMBINED: //## Handle translation of COMBINED member from IfcTransformerTypeEnum in property PredefinedType - //TODO: Handle translation of COMBINED member from IfcTransformerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTransformerTypeEnum.CURRENT: return Ifc4.Interfaces.IfcTransformerTypeEnum.CURRENT; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformerType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformerType.cs index 5df23aa13..bef0c2ddb 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformerType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransformerType.cs @@ -32,13 +32,11 @@ Ifc4.Interfaces.IfcTransformerTypeEnum IIfcTransformerType.PredefinedType { case IfcTransformerTypeEnum.CHOPPER: //## Handle translation of CHOPPER member from IfcTransformerTypeEnum in property PredefinedType - //TODO: Handle translation of CHOPPER member from IfcTransformerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTransformerTypeEnum.COMBINED: //## Handle translation of COMBINED member from IfcTransformerTypeEnum in property PredefinedType - //TODO: Handle translation of COMBINED member from IfcTransformerTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTransformerTypeEnum.CURRENT: return Ifc4.Interfaces.IfcTransformerTypeEnum.CURRENT; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElement.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElement.cs index c6b7f78d0..3c6dd80df 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElement.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElement.cs @@ -38,8 +38,7 @@ public partial class @IfcTransportElement : IIfcTransportElement return Ifc4.Interfaces.IfcTransportElementTypeEnum.ESCALATOR; case IfcTransportElementTypeEnum.HAULINGGEAR: //## Handle translation of HAULINGGEAR member from IfcTransportElementTypeEnum in property PredefinedType - //TODO: Handle translation of HAULINGGEAR member from IfcTransportElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTransportElementTypeEnum.LIFTINGGEAR: return Ifc4.Interfaces.IfcTransportElementTypeEnum.LIFTINGGEAR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElementType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElementType.cs index 80303874d..7aea988c3 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElementType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcTransportElementType.cs @@ -38,8 +38,7 @@ Ifc4.Interfaces.IfcTransportElementTypeEnum IIfcTransportElementType.PredefinedT return Ifc4.Interfaces.IfcTransportElementTypeEnum.ESCALATOR; case IfcTransportElementTypeEnum.HAULINGGEAR: //## Handle translation of HAULINGGEAR member from IfcTransportElementTypeEnum in property PredefinedType - //TODO: Handle translation of HAULINGGEAR member from IfcTransportElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcTransportElementTypeEnum.LIFTINGGEAR: return Ifc4.Interfaces.IfcTransportElementTypeEnum.LIFTINGGEAR; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElement.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElement.cs index 9717b42e8..b6598885a 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElement.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElement.cs @@ -34,13 +34,11 @@ public partial class @IfcUnitaryControlElement : IIfcUnitaryControlElement return Ifc4.Interfaces.IfcUnitaryControlElementTypeEnum.ALARMPANEL; case IfcUnitaryControlElementTypeEnum.BASESTATIONCONTROLLER: //## Handle translation of BASESTATIONCONTROLLER member from IfcUnitaryControlElementTypeEnum in property PredefinedType - //TODO: Handle translation of BASESTATIONCONTROLLER member from IfcUnitaryControlElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcUnitaryControlElementTypeEnum.COMBINED: //## Handle translation of COMBINED member from IfcUnitaryControlElementTypeEnum in property PredefinedType - //TODO: Handle translation of COMBINED member from IfcUnitaryControlElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcUnitaryControlElementTypeEnum.CONTROLPANEL: return Ifc4.Interfaces.IfcUnitaryControlElementTypeEnum.CONTROLPANEL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElementType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElementType.cs index f0b64ee0c..7694eae83 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElementType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcUnitaryControlElementType.cs @@ -34,13 +34,11 @@ Ifc4.Interfaces.IfcUnitaryControlElementTypeEnum IIfcUnitaryControlElementType.P return Ifc4.Interfaces.IfcUnitaryControlElementTypeEnum.ALARMPANEL; case IfcUnitaryControlElementTypeEnum.BASESTATIONCONTROLLER: //## Handle translation of BASESTATIONCONTROLLER member from IfcUnitaryControlElementTypeEnum in property PredefinedType - //TODO: Handle translation of BASESTATIONCONTROLLER member from IfcUnitaryControlElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcUnitaryControlElementTypeEnum.COMBINED: //## Handle translation of COMBINED member from IfcUnitaryControlElementTypeEnum in property PredefinedType - //TODO: Handle translation of COMBINED member from IfcUnitaryControlElementTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcUnitaryControlElementTypeEnum.CONTROLPANEL: return Ifc4.Interfaces.IfcUnitaryControlElementTypeEnum.CONTROLPANEL; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolator.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolator.cs index be120c26b..91b400ad4 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolator.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolator.cs @@ -32,8 +32,7 @@ public partial class @IfcVibrationIsolator : IIfcVibrationIsolator { case IfcVibrationIsolatorTypeEnum.BASE: //## Handle translation of BASE member from IfcVibrationIsolatorTypeEnum in property PredefinedType - //TODO: Handle translation of BASE member from IfcVibrationIsolatorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcVibrationIsolatorTypeEnum.COMPRESSION: return Ifc4.Interfaces.IfcVibrationIsolatorTypeEnum.COMPRESSION; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolatorType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolatorType.cs index 2312d92ea..61080a556 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolatorType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcVibrationIsolatorType.cs @@ -32,8 +32,7 @@ Ifc4.Interfaces.IfcVibrationIsolatorTypeEnum IIfcVibrationIsolatorType.Predefine { case IfcVibrationIsolatorTypeEnum.BASE: //## Handle translation of BASE member from IfcVibrationIsolatorTypeEnum in property PredefinedType - //TODO: Handle translation of BASE member from IfcVibrationIsolatorTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcVibrationIsolatorTypeEnum.COMPRESSION: return Ifc4.Interfaces.IfcVibrationIsolatorTypeEnum.COMPRESSION; diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcWall.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcWall.cs index 398f203b4..da53766f1 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcWall.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcWall.cs @@ -44,8 +44,7 @@ public partial class @IfcWall : IIfcWall return Ifc4.Interfaces.IfcWallTypeEnum.POLYGONAL; case IfcWallTypeEnum.RETAININGWALL: //## Handle translation of RETAININGWALL member from IfcWallTypeEnum in property PredefinedType - //TODO: Handle translation of RETAININGWALL member from IfcWallTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcWallTypeEnum.SHEAR: return Ifc4.Interfaces.IfcWallTypeEnum.SHEAR; @@ -55,8 +54,7 @@ public partial class @IfcWall : IIfcWall return Ifc4.Interfaces.IfcWallTypeEnum.STANDARD; case IfcWallTypeEnum.WAVEWALL: //## Handle translation of WAVEWALL member from IfcWallTypeEnum in property PredefinedType - //TODO: Handle translation of WAVEWALL member from IfcWallTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcWallTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcWallType.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcWallType.cs index 8edf24095..acc9ce97c 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcWallType.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcWallType.cs @@ -44,8 +44,7 @@ Ifc4.Interfaces.IfcWallTypeEnum IIfcWallType.PredefinedType return Ifc4.Interfaces.IfcWallTypeEnum.POLYGONAL; case IfcWallTypeEnum.RETAININGWALL: //## Handle translation of RETAININGWALL member from IfcWallTypeEnum in property PredefinedType - //TODO: Handle translation of RETAININGWALL member from IfcWallTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcWallTypeEnum.SHEAR: return Ifc4.Interfaces.IfcWallTypeEnum.SHEAR; @@ -55,8 +54,7 @@ Ifc4.Interfaces.IfcWallTypeEnum IIfcWallType.PredefinedType return Ifc4.Interfaces.IfcWallTypeEnum.STANDARD; case IfcWallTypeEnum.WAVEWALL: //## Handle translation of WAVEWALL member from IfcWallTypeEnum in property PredefinedType - //TODO: Handle translation of WAVEWALL member from IfcWallTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcWallTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IFC4X1/IfcReferent.cs b/Xbim.Ifc4x3/Interfaces/IFC4X1/IfcReferent.cs index e10759201..57018df0f 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4X1/IfcReferent.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4X1/IfcReferent.cs @@ -33,44 +33,37 @@ public partial class @IfcReferent : IIfcReferent { case IfcReferentTypeEnum.BOUNDARY: //## Handle translation of BOUNDARY member from IfcReferentTypeEnum in property PredefinedType - //TODO: Handle translation of BOUNDARY member from IfcReferentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReferentTypeEnum.INTERSECTION: //## Handle translation of INTERSECTION member from IfcReferentTypeEnum in property PredefinedType - //TODO: Handle translation of INTERSECTION member from IfcReferentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReferentTypeEnum.KILOPOINT: return Ifc4.Interfaces.IfcReferentTypeEnum.KILOPOINT; case IfcReferentTypeEnum.LANDMARK: //## Handle translation of LANDMARK member from IfcReferentTypeEnum in property PredefinedType - //TODO: Handle translation of LANDMARK member from IfcReferentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReferentTypeEnum.MILEPOINT: return Ifc4.Interfaces.IfcReferentTypeEnum.MILEPOINT; case IfcReferentTypeEnum.POSITION: //## Handle translation of POSITION member from IfcReferentTypeEnum in property PredefinedType - //TODO: Handle translation of POSITION member from IfcReferentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReferentTypeEnum.REFERENCEMARKER: //## Handle translation of REFERENCEMARKER member from IfcReferentTypeEnum in property PredefinedType - //TODO: Handle translation of REFERENCEMARKER member from IfcReferentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReferentTypeEnum.STATION: return Ifc4.Interfaces.IfcReferentTypeEnum.STATION; case IfcReferentTypeEnum.SUPERELEVATIONEVENT: //## Handle translation of SUPERELEVATIONEVENT member from IfcReferentTypeEnum in property PredefinedType - //TODO: Handle translation of SUPERELEVATIONEVENT member from IfcReferentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReferentTypeEnum.WIDTHEVENT: //## Handle translation of WIDTHEVENT member from IfcReferentTypeEnum in property PredefinedType - //TODO: Handle translation of WIDTHEVENT member from IfcReferentTypeEnum in property PredefinedType - throw new System.NotImplementedException(); + return this.GetUserDefined(); //## case IfcReferentTypeEnum.USERDEFINED: //## Optional custom handling of PredefinedType == .USERDEFINED. diff --git a/Xbim.Ifc4x3/Interfaces/IfcObjectDefinitionExtensions.cs b/Xbim.Ifc4x3/Interfaces/IfcObjectDefinitionExtensions.cs new file mode 100644 index 000000000..34098dda3 --- /dev/null +++ b/Xbim.Ifc4x3/Interfaces/IfcObjectDefinitionExtensions.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Concurrent; + + +namespace Xbim.Ifc4.Interfaces +{ + public static class IfcObjectDefinitionExtensions + { + // map of an Enum Type to its USERDEFINED entry + private static ConcurrentDictionary UserDefinedEnumCache = new ConcurrentDictionary(); + + /// + /// Returns the Enum with value of "USERDEFINED" for the Enum + /// + /// A cache is used for efficiency + /// The target Enum type + /// The object - for future use + /// + public static TOut GetUserDefined(this IIfcObjectDefinition _) where TOut : Enum + { + var enumType = typeof(TOut); + + var undefinedEnum = UserDefinedEnumCache.GetOrAdd(enumType, GetUserdefined(enumType)); + if (undefinedEnum == null) + { + return default; // Doesn't contain USERDEFINED + } + return (TOut)undefinedEnum; + } + + private static Enum GetUserdefined(Type enumType) + { + try + { + return (Enum)Enum.Parse(enumType, "USERDEFINED"); + } + catch { } + return default; + } + } +} From a14aa293dbc074a061347689b7d9fe1cd8bd9be0 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Thu, 6 Mar 2025 10:50:59 +0000 Subject: [PATCH 08/16] Further IFc4x3 fixups and IFC4 mappings --- Tests/Ifc4ExtensionsTests.cs | 2 ++ .../Interfaces/IFC4/IfcCompositeCurveOnSurface.cs | 9 ++++----- Xbim.Ifc4x3/Interfaces/IFC4/IfcRelAssigns.cs | 10 ++++------ .../Interfaces/IFC4/IfcRelDefinesByProperties.cs | 9 ++++----- .../Kernel/IfcPropertySetDefinitionSet.Partial.cs | 10 ++++++---- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Tests/Ifc4ExtensionsTests.cs b/Tests/Ifc4ExtensionsTests.cs index 239a8b224..665e34048 100644 --- a/Tests/Ifc4ExtensionsTests.cs +++ b/Tests/Ifc4ExtensionsTests.cs @@ -156,6 +156,8 @@ public void CanSetPropertySingleValueGenericEdgeCase() { var pile = Model.Instances.New(); + pile.SetPropertySingleValue("Pset_Test", "SomeProp"); + var value = pile.GetPropertySingleValue("Pset_Test", "SomeProp"); value.Should().NotBeNull(); value.Value.Should().Be(1.0); diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCompositeCurveOnSurface.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCompositeCurveOnSurface.cs index ecd4bac27..a33aa1e5f 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcCompositeCurveOnSurface.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcCompositeCurveOnSurface.cs @@ -24,11 +24,10 @@ List IIfcCompositeCurveOnSurface.BasisSurface { get { - //## Getter for BasisSurface in an interface - //TODO: Implement getter for derived attribute BasisSurface in an interface - throw new System.NotImplementedException(); - //## - } + //## Getter for BasisSurface in an interface + return IfcGetBasisSurface(this).Cast().ToList(); + //## + } } //## Custom code diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelAssigns.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelAssigns.cs index 5248331f9..3102b4cca 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelAssigns.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelAssigns.cs @@ -37,15 +37,13 @@ IItemSet IIfcRelAssigns.RelatedObjects get { //## Handle return of RelatedObjectsType for which no match was found - //TODO: Handle return of RelatedObjectsType for which no match was found - throw new System.NotImplementedException(); - //## - } + return Ifc4.Interfaces.IfcObjectTypeEnum.NOTDEFINED; // Not supported in IFC4x3 + //## + } set { //## Handle setting of RelatedObjectsType for which no match was found - //TODO: Handle setting of RelatedObjectsType for which no match was found - throw new System.NotImplementedException(); + // Do nothing. Deprecated in IFC4 //## } diff --git a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelDefinesByProperties.cs b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelDefinesByProperties.cs index c01bce726..49339e45a 100644 --- a/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelDefinesByProperties.cs +++ b/Xbim.Ifc4x3/Interfaces/IFC4/IfcRelDefinesByProperties.cs @@ -40,11 +40,10 @@ IIfcPropertySetDefinitionSelect IIfcRelDefinesByProperties.RelatingPropertyDefin var ifcpropertysetdefinition = RelatingPropertyDefinition as IfcPropertySetDefinition; if (ifcpropertysetdefinition != null) return ifcpropertysetdefinition; - if (RelatingPropertyDefinition is IfcPropertySetDefinitionSet) - //## Handle defined type IfcPropertySetDefinitionSet which is not a part of the target select interface IIfcPropertySetDefinitionSelect in property RelatingPropertyDefinition - //TODO: Handle defined type IfcPropertySetDefinitionSet which is not a part of the target select interface IIfcPropertySetDefinitionSelect in property RelatingPropertyDefinition - throw new System.NotImplementedException(); - //## + //## Handle defined type IfcPropertySetDefinitionSet which is not a part of the target select interface IIfcPropertySetDefinitionSelect in property RelatingPropertyDefinition + if (RelatingPropertyDefinition is IfcPropertySetDefinitionSet set) + return set; + //## return null; } set diff --git a/Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSet.Partial.cs b/Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSet.Partial.cs index 63975db65..b79a690e6 100644 --- a/Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSet.Partial.cs +++ b/Xbim.Ifc4x3/Kernel/IfcPropertySetDefinitionSet.Partial.cs @@ -1,10 +1,12 @@ using System.Collections.Generic; +using Xbim.Ifc4.Interfaces; namespace Xbim.Ifc4x3.Kernel { - public partial struct IfcPropertySetDefinitionSet - { + public partial struct IfcPropertySetDefinitionSet : IIfcPropertySetDefinitionSelect + { public IEnumerable PropertySetDefinitions => _value; - - } + + IEnumerable IIfcPropertySetDefinitionSelect.PropertySetDefinitions => _value; + } } From ba17da46efd5237712af7a60137c1dd9f9df1ac5 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Tue, 11 Mar 2025 13:47:43 +0000 Subject: [PATCH 09/16] Update to ExpressMetaData so we can host multiple schemas in a single assembly. This may be a design decision but can also occur when for instance ILMerge-ing xbim assemblies. --- Tests/CommonTests.cs | 4 +- Tests/ExpressMetadataTests.cs | 54 +++++++++++++ Xbim.Common/Metadata/ExpressMetaData.cs | 76 ++++++++++++++----- Xbim.Common/Metadata/ExpressType.cs | 3 +- Xbim.Common/Model/StepModel.cs | 2 +- Xbim.Common/PersistEntity.cs | 2 + Xbim.IO.Esent/Esent/EsentModel.cs | 2 +- .../Interfaces/Conversions/IfcValueHelper.cs | 4 +- 8 files changed, 119 insertions(+), 28 deletions(-) create mode 100644 Tests/ExpressMetadataTests.cs diff --git a/Tests/CommonTests.cs b/Tests/CommonTests.cs index 720cdd13f..9771ebb6d 100644 --- a/Tests/CommonTests.cs +++ b/Tests/CommonTests.cs @@ -64,8 +64,8 @@ public void Can_skip_entities_while_parsing() using (var strm = File.OpenRead(@"TestFiles\4walls1floorSite.ifc")) { - var ifc2x3MetaData = ExpressMetaData.GetMetadata((new Xbim.Ifc2x3.EntityFactoryIfc2x3()).GetType().GetTypeInfo().Module); - var ifc4MetaData = ExpressMetaData.GetMetadata((new Xbim.Ifc4.EntityFactoryIfc4()).GetType().GetTypeInfo().Module); + var ifc2x3MetaData = ExpressMetaData.GetMetadata(new Xbim.Ifc2x3.EntityFactoryIfc2x3()); + var ifc4MetaData = ExpressMetaData.GetMetadata(new Xbim.Ifc4.EntityFactoryIfc4()); var allTypes = new HashSet( ifc2x3MetaData.Types().Where(et => typeof(IPersistEntity).IsAssignableFrom(et.Type) && !et.Type.IsAbstract ).Select(et => et.ExpressNameUpper) .Concat(ifc2x3MetaData.Types().Where(et => typeof(IPersistEntity).IsAssignableFrom(et.Type) && !et.Type.IsAbstract).Select(et => et.ExpressNameUpper))); diff --git a/Tests/ExpressMetadataTests.cs b/Tests/ExpressMetadataTests.cs new file mode 100644 index 000000000..c1030610b --- /dev/null +++ b/Tests/ExpressMetadataTests.cs @@ -0,0 +1,54 @@ +using FluentAssertions; +using System; +using System.Reflection; +using Xbim.Common; +using Xbim.Common.Metadata; +using Xunit; + +namespace Xbim.Essentials.Tests +{ + public class ExpressMetadataTests + { + [InlineData(typeof(Xbim.Common.PersistEntity), 0)] // Nothing defined in this schema + [InlineData(typeof(Xbim.Ifc2x3.EntityFactoryIfc2x3), 771)] + [InlineData(typeof(Xbim.Ifc4.EntityFactoryIfc4), 933)] + [InlineData(typeof(Xbim.Ifc4.EntityFactoryIfc4x1), 933)] + [InlineData(typeof(Xbim.Ifc4x3.EntityFactoryIfc4x3Add2), 1008)] + [Theory] + [Obsolete] + public void HasExpectedSchemaTypesByModule(Type moduleType, int expectedTypes) + { + + var m = moduleType.GetTypeInfo().Module; + var metaData = ExpressMetaData.GetMetadata(moduleType.Module); + metaData.Types().Should().HaveCount(expectedTypes); + } + + [InlineData(typeof(Xbim.Ifc2x3.EntityFactoryIfc2x3), 771)] + [InlineData(typeof(Xbim.Ifc4.EntityFactoryIfc4), 933)] + [InlineData(typeof(Xbim.Ifc4.EntityFactoryIfc4x1), 933)] + [InlineData(typeof(Xbim.Ifc4x3.EntityFactoryIfc4x3Add2), 1008)] + [Theory] + public void HasExpectedSchemaTypesByFactory(Type moduleType, int expectedTypes) + { + + var factory = Activator.CreateInstance(moduleType) as IEntityFactory; + factory.Should().NotBeNull(); + var metaData = ExpressMetaData.GetMetadata(factory); + metaData.Types().Should().HaveCount(expectedTypes); + } + + [Fact] + public void InvalidExpressTypeHandled() + { + var expressType = new ExpressType(typeof(Ifc2x3.ActorResource.IfcActorRole)); + expressType.Should().NotBeNull(); + + + Action act = () => new ExpressType(typeof(IPersistEntity)); + + act.Should().Throw().WithMessage("Express Type is not defined for IPersistEntity"); + + } + } +} diff --git a/Xbim.Common/Metadata/ExpressMetaData.cs b/Xbim.Common/Metadata/ExpressMetaData.cs index 6d6193e51..92ac61455 100644 --- a/Xbim.Common/Metadata/ExpressMetaData.cs +++ b/Xbim.Common/Metadata/ExpressMetaData.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -55,31 +56,42 @@ public class ExpressMetaData /// /// Static cache to avoid multiple creation of the structure /// - private static readonly Dictionary Cache = new Dictionary(); + private static readonly ConcurrentDictionary Cache = new ConcurrentDictionary(); + + private static readonly ConcurrentDictionary FactoryCache = new ConcurrentDictionary(); - private static readonly object _lock = new object(); /// /// This method creates metadata model for a specified module based on reflection and custom attributes. /// It only creates ExpressMetaData once for any module. If it already exists it is retrieved from a /// static cache. However, for a performance reasons try to minimize this and rather keep a single instance /// reference for your code. /// + /// Prefer GetMetadata(IEntityFactory) overload which permits more control over schema enumeration /// Assembly module which contains single schema model /// Meta data structure for the schema defined within the module + [Obsolete("Prefer ExpressMetaData GetMetadata(IEntityFactory) overload")] public static ExpressMetaData GetMetadata(Module module) { + return Cache.GetOrAdd(module, m => new ExpressMetaData(m)); + } - ExpressMetaData result; - if (Cache.TryGetValue(module, out result)) - return result; - lock (_lock) + /// + /// Creates an metadata model for a specified based on reflection and custom attributes. + /// An ExpressMetaData is creted only once for any EntityFactory. + /// + /// Only types sharing the same namespace as the are included. This makes it possible + /// to share multiple schemas in a single Assembly / Module + /// + /// + /// + public static ExpressMetaData GetMetadata(IEntityFactory entityFactory) + { + if (entityFactory is null) { - if (Cache.TryGetValue(module, out result)) - return result; - result = new ExpressMetaData(module); - Cache.Add(module, result); - return result; + throw new ArgumentNullException(nameof(entityFactory)); } + + return FactoryCache.GetOrAdd(entityFactory, f => new ExpressMetaData(f)); } private ExpressMetaData(Module module) @@ -87,15 +99,7 @@ private ExpressMetaData(Module module) Module = module; var typesToProcess = module.GetTypes().Where( - t => - { - var ti = t.GetTypeInfo(); - return typeof(IPersist).GetTypeInfo().IsAssignableFrom(t) - && t != typeof(IPersist) - && !ti.IsEnum && !ti.IsInterface - && ti.IsPublic - && !typeof(IExpressHeaderType).GetTypeInfo().IsAssignableFrom(t); - }).ToList(); + t => IsExpressTypeForSchema(t)).ToList(); _typeIdToExpressTypeLookup = new Dictionary(typesToProcess.Count); _typeNameToExpressTypeLookup = new Dictionary(typesToProcess.Count); @@ -103,6 +107,38 @@ private ExpressMetaData(Module module) _typeToExpressTypeLookup = new ExpressTypeDictionary(); _interfaceToExpressTypesLookup = new Dictionary>(); + RegisterTypes(typesToProcess); + } + + private ExpressMetaData(IEntityFactory factory) + { + Module = factory.GetType().Module; + var schemaNamespace = factory.GetType().Namespace; + var typesToProcess = + Module.GetTypes().Where( + t => IsExpressTypeForSchema(t, schemaNamespace)).ToList(); + + _typeIdToExpressTypeLookup = new Dictionary(typesToProcess.Count); + _typeNameToExpressTypeLookup = new Dictionary(typesToProcess.Count); + _persistNameToExpressTypeLookup = new Dictionary(typesToProcess.Count); + _typeToExpressTypeLookup = new ExpressTypeDictionary(); + _interfaceToExpressTypesLookup = new Dictionary>(); + + RegisterTypes(typesToProcess); + } + + private static bool IsExpressTypeForSchema(Type type, string schemaNamespace = "") + { + return typeof(IPersist).GetTypeInfo().IsAssignableFrom(type) + && type.IsPublic + && !type.IsEnum && !type.IsInterface + && type.GetCustomAttributes(typeof(ExpressTypeAttribute), false).Any() + && !typeof(IExpressHeaderType).GetTypeInfo().IsAssignableFrom(type) + && (string.IsNullOrEmpty(schemaNamespace) || type.Namespace.StartsWith(schemaNamespace)); + } + + private void RegisterTypes(IList typesToProcess) + { // System.Diagnostics.Debug.Write(typesToProcess.Count()); foreach (var typeToProcess in typesToProcess) { diff --git a/Xbim.Common/Metadata/ExpressType.cs b/Xbim.Common/Metadata/ExpressType.cs index b8351be40..253609b63 100644 --- a/Xbim.Common/Metadata/ExpressType.cs +++ b/Xbim.Common/Metadata/ExpressType.cs @@ -97,10 +97,9 @@ public ExpressType(Type type) Type = type; var typeInfo = Type.GetTypeInfo(); var entNameAttr = typeInfo.GetCustomAttributes(typeof(ExpressTypeAttribute), false).FirstOrDefault(); -#if DEBUG + if (entNameAttr == null) throw new Exception("Express Type is not defined for " + Type.Name); -#endif _typeId = (short)((ExpressTypeAttribute)entNameAttr).EntityTypeId; _expressName = ((ExpressTypeAttribute)entNameAttr).Name; _expressNameUpper = _expressName.ToUpperInvariant(); diff --git a/Xbim.Common/Model/StepModel.cs b/Xbim.Common/Model/StepModel.cs index 9308eff9f..1a75bfa9a 100644 --- a/Xbim.Common/Model/StepModel.cs +++ b/Xbim.Common/Model/StepModel.cs @@ -250,7 +250,7 @@ public ExpressMetaData Metadata { get { return _metadata ?? - (_metadata = ExpressMetaData.GetMetadata(EntityFactory.GetType().GetTypeInfo().Module)); + (_metadata = ExpressMetaData.GetMetadata(EntityFactory)); } } diff --git a/Xbim.Common/PersistEntity.cs b/Xbim.Common/PersistEntity.cs index 564b9f5d8..6d7148e8f 100644 --- a/Xbim.Common/PersistEntity.cs +++ b/Xbim.Common/PersistEntity.cs @@ -144,7 +144,9 @@ public override string ToString() if (Model != null) md = Model.Metadata; else +#pragma warning disable CS0618 // Type or member is obsolete md = ExpressMetaData.GetMetadata(GetType().Module); +#pragma warning restore CS0618 // Type or member is obsolete using (var sw = new StringWriter()) { diff --git a/Xbim.IO.Esent/Esent/EsentModel.cs b/Xbim.IO.Esent/Esent/EsentModel.cs index f0533782d..3ffef2d00 100644 --- a/Xbim.IO.Esent/Esent/EsentModel.cs +++ b/Xbim.IO.Esent/Esent/EsentModel.cs @@ -117,7 +117,7 @@ protected void Init(IEntityFactory factory) InstancesLocal = new XbimInstanceCollection(this); var r = new Random(); UserDefinedId = (short)r.Next(short.MaxValue); // initialise value at random to reduce chance of duplicates - Metadata = ExpressMetaData.GetMetadata(factory.GetType().Module); + Metadata = ExpressMetaData.GetMetadata(factory); ModelFactors = new XbimModelFactors(Math.PI / 180, 1e-3, 1e-5); } catch(Exception ex) diff --git a/Xbim.Ifc4x3/Interfaces/Conversions/IfcValueHelper.cs b/Xbim.Ifc4x3/Interfaces/Conversions/IfcValueHelper.cs index fc71fd211..397768359 100644 --- a/Xbim.Ifc4x3/Interfaces/Conversions/IfcValueHelper.cs +++ b/Xbim.Ifc4x3/Interfaces/Conversions/IfcValueHelper.cs @@ -17,8 +17,8 @@ public static class IfcValueHelper private static ExpressMetaData _ifc4meta; private static ExpressMetaData _ifc4x3meta; - private static ExpressMetaData Ifc4Meta => _ifc4meta ?? (_ifc4meta = ExpressMetaData.GetMetadata(typeof(Ifc4.Interfaces.IIfcValue).Module)); - private static ExpressMetaData Ifc4x3Meta => _ifc4x3meta ?? (_ifc4x3meta = ExpressMetaData.GetMetadata(typeof(Ifc4x3.MeasureResource.IfcValue).Module)); + private static ExpressMetaData Ifc4Meta => _ifc4meta ?? (_ifc4meta = ExpressMetaData.GetMetadata(new Ifc4.EntityFactoryIfc4())); + private static ExpressMetaData Ifc4x3Meta => _ifc4x3meta ?? (_ifc4x3meta = ExpressMetaData.GetMetadata(new Ifc4x3.EntityFactoryIfc4x3Add2())); public static Ifc4.Interfaces.IIfcValue ToIfc4(this Ifc4x3.MeasureResource.IfcValue value) { From 65aceb5d8fda78da2606944f22ecc64faa7f3b06 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Thu, 13 Mar 2025 12:45:56 +0000 Subject: [PATCH 10/16] Added support for handling IfcStyledByItem creation with cross-schema interfaces #603 --- Xbim.Essentials.NetCore.Tests/GithubTests.cs | 212 ++++++++++++++++++ .../Xbim.Essentials.NetCore.Tests.csproj | 3 +- Xbim.Ifc2x3/Interfaces/IFC4/IfcStyledItem.cs | 7 +- 3 files changed, 219 insertions(+), 3 deletions(-) diff --git a/Xbim.Essentials.NetCore.Tests/GithubTests.cs b/Xbim.Essentials.NetCore.Tests/GithubTests.cs index 95b72f93e..fcc963fc6 100644 --- a/Xbim.Essentials.NetCore.Tests/GithubTests.cs +++ b/Xbim.Essentials.NetCore.Tests/GithubTests.cs @@ -15,6 +15,218 @@ namespace Xbim.Essentials.NetCore.Tests public class GithubTests { + + + [Fact] + public void Issue_603_StyledItem_Ifc2x3Native() + { + using var model = new MemoryModel(new Ifc2x3.EntityFactoryIfc2x3()); + + Ifc2x3.PresentationAppearanceResource.IfcStyledItem nativeStyledItem = CreateIfc2x3StyledItem(model); + + nativeStyledItem.Styles.Should().HaveCount(1); + var firstStyle = nativeStyledItem.Styles.First(); + firstStyle.Should().NotBeNull(); + firstStyle.Should().BeOfType(); + // and contents of assignment are the Style + firstStyle.Styles.Should().HaveCount(1); + firstStyle.Styles.First().Should().BeOfType(); + + IIfcStyledItem si = nativeStyledItem; + + si.Styles.First().Should().BeAssignableTo(); + } + + [Fact] + public void Issue_603_StyledItem_Ifc4x3Native() + { + using var model = new MemoryModel(new Ifc4x3.EntityFactoryIfc4x3Add2()); + + Ifc4x3.PresentationAppearanceResource.IfcStyledItem nativeStyledItem = CreateIfc4x3StyledItem(model); + + nativeStyledItem.Styles.Should().HaveCount(1); + var firstStyle = nativeStyledItem.Styles.First(); + firstStyle.Should().NotBeNull(); + firstStyle.Should().BeOfType(); + + IIfcStyledItem si = nativeStyledItem; + + si.Styles.First().Should().BeAssignableTo(); + } + + [Fact] + public void Issue_603_StyledItem_Ifc2x3() + { + using var model = new MemoryModel(new Ifc2x3.EntityFactoryIfc2x3()); + + IIfcStyledItem si = CreateStyledItemViaInterfaces(model); + + var nativeStyledItem = si as Ifc2x3.PresentationAppearanceResource.IfcStyledItem; + + nativeStyledItem.Styles.Should().HaveCount(1); + var firstStyle = nativeStyledItem.Styles.First(); + firstStyle.Should().NotBeNull(); + firstStyle.Should().BeAssignableTo(); + // Styles are accessed indirectly via PresentationStyleAssignment's Styles. + firstStyle.Styles.Should().HaveCount(1); + firstStyle.Styles.First().Should().BeAssignableTo(); + } + + + [Fact] + public void Issue_603_StyledItem_Ifc4() + { + using var model = new MemoryModel(new Ifc4.EntityFactoryIfc4()); + + IIfcStyledItem si = CreateStyledItemViaInterfaces(model); + + var nativeStyledItem = si as Ifc4.PresentationAppearanceResource.IfcStyledItem; + + nativeStyledItem.Styles.Should().HaveCount(1); + var firstStyle = nativeStyledItem.Styles.First(); + firstStyle.Should().NotBeNull(); + firstStyle.Should().BeAssignableTo(); + } + + [Fact] + public void Issue_603_StyledItem_Ifc4x3() + { + using var model = new MemoryModel(new Ifc4x3.EntityFactoryIfc4x3Add2()); + + IIfcStyledItem si = CreateStyledItemViaInterfaces(model); + + var nativeStyledItem = si as Ifc4x3.PresentationAppearanceResource.IfcStyledItem; + + nativeStyledItem.Styles.Should().HaveCount(1); + var firstStyle = nativeStyledItem.Styles.First(); + firstStyle.Should().NotBeNull(); + firstStyle.Should().BeAssignableTo(); + } + + // Use the IFC2x3 IIfcPresentationStyleAssignment explicitly (vs implicit conversion from IFC4+ IfcPresentationStyles) + [Fact] + public void Issue_603_StyledItem_Ifc2x3_BackwardCompatibility() + { + using var model = new MemoryModel(new Ifc2x3.EntityFactoryIfc2x3()); + + // Explicitly create the IfcPresentationStyleAssignment vs implicit via IFC4 interfaces + IIfcStyledItem si = CreateStyledItemViaInterfaces(model, true); + + var nativeStyledItem = si as Ifc2x3.PresentationAppearanceResource.IfcStyledItem; + + nativeStyledItem.Styles.Should().HaveCount(1); + var firstStyle = nativeStyledItem.Styles.First(); + firstStyle.Should().NotBeNull(); + firstStyle.Should().BeAssignableTo(); + firstStyle.Styles.Should().HaveCount(1); + firstStyle.Styles.First().Should().BeAssignableTo(); + } + + private IIfcStyledItem CreateStyledItemViaInterfaces(MemoryModel model, bool useStyleAssignment = false) + { + using var txn = model.BeginTransaction("Test"); + var factory = new EntityCreator(model); + + var surfaceStyle = factory.SurfaceStyle(style => + { + var defaultStyle = factory.SurfaceStyleShading(l => + { + l.SurfaceColour = factory.ColourRgb(rgb => + { + rgb.Red = 1.0; + rgb.Green = 0.0; + rgb.Blue = 0.0; + }); + }); + + style.Side = IfcSurfaceSide.BOTH; + style.Styles.Add(defaultStyle); + }); + var si = factory.StyledItem(styleItem => + { + if(useStyleAssignment && model.SchemaVersion == Common.Step21.XbimSchemaVersion.Ifc2X3) + { + var assignment = model.Instances.New(a => + { + a.Styles.Add((Ifc2x3.PresentationAppearanceResource.IfcSurfaceStyle)surfaceStyle); + }); + styleItem.Styles.Add(assignment); + } + else + { + // IFC 4/4.3 way + styleItem.Styles.Add(surfaceStyle); + } + }); + txn.Commit(); + return si; + } + + private Ifc2x3.PresentationAppearanceResource.IfcStyledItem CreateIfc2x3StyledItem(MemoryModel model) + { + using var txn = model.BeginTransaction("Test"); + + + var surfaceStyle = model.Instances.New(style => + { + var defaultStyle = model.Instances.New(l => + { + l.SurfaceColour = model.Instances.New(rgb => + { + rgb.Red = 1.0; + rgb.Green = 0.0; + rgb.Blue = 0.0; + }); + }); + + style.Styles.Add(defaultStyle); + }); + var si = model.Instances.New(styleItem => + { + // IfcPresentationStyleAssignment Required in IFC2x3, Optional in IFC4 and deprecated/removed in 4x3 + var presStyleAssignment = model.Instances.New(a => + { + a.Styles.Add(surfaceStyle); + }); + styleItem.Styles.Add(presStyleAssignment); + }); + txn.Commit(); + return si; + } + + private Ifc4x3.PresentationAppearanceResource.IfcStyledItem CreateIfc4x3StyledItem(MemoryModel model) + { + using var txn = model.BeginTransaction("Test"); + + + var surfaceStyle = model.Instances.New(style => + { + var defaultStyle = model.Instances.New(l => + { + l.SurfaceColour = model.Instances.New(rgb => + { + rgb.Red = 1.0; + rgb.Green = 0.0; + rgb.Blue = 0.0; + }); + }); + + style.Styles.Add(defaultStyle); + }); + var si = model.Instances.New(styleItem => + { + // IfcPresentationStyleAssignment deprecated/removed in 4x3 + //var presStyleAssignment = model.Instances.New(a => + //{ + // a.Styles.Add(style); + //}); + styleItem.Styles.Add(surfaceStyle); + }); + txn.Commit(); + return si; + } + + [Fact] public void GithubIssue_595_Fails_With_LinqSelectMany() diff --git a/Xbim.Essentials.NetCore.Tests/Xbim.Essentials.NetCore.Tests.csproj b/Xbim.Essentials.NetCore.Tests/Xbim.Essentials.NetCore.Tests.csproj index fc6d22bbc..348084166 100644 --- a/Xbim.Essentials.NetCore.Tests/Xbim.Essentials.NetCore.Tests.csproj +++ b/Xbim.Essentials.NetCore.Tests/Xbim.Essentials.NetCore.Tests.csproj @@ -20,8 +20,7 @@ - - + diff --git a/Xbim.Ifc2x3/Interfaces/IFC4/IfcStyledItem.cs b/Xbim.Ifc2x3/Interfaces/IFC4/IfcStyledItem.cs index f9417aa4c..47438584e 100644 --- a/Xbim.Ifc2x3/Interfaces/IFC4/IfcStyledItem.cs +++ b/Xbim.Ifc2x3/Interfaces/IFC4/IfcStyledItem.cs @@ -55,7 +55,12 @@ private static IIfcStyleAssignmentSelect StylesToIfc4 (IfcPresentationStyleAssig } //transformation function to convert/cast IFC4 data to appear as IFC2x3 if possible - private static IfcPresentationStyleAssignment StylesToIfc2X3 (IIfcStyleAssignmentSelect member){ + private IfcPresentationStyleAssignment StylesToIfc2X3 (IIfcStyleAssignmentSelect member){ + + if(member is IIfcPresentationStyleSelect ps && Model.CurrentTransaction != null) + { + return Model.Instances.New(pa => ((IIfcPresentationStyleAssignment)pa).Styles.Add(ps)); + } return member as IfcPresentationStyleAssignment; } From e85ef594987dbf826ecda7740c83324dce73c8f6 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Thu, 20 Mar 2025 12:04:51 +0000 Subject: [PATCH 11/16] Added Test case for #605 --- Tests/ParsingTests.cs | 20 ++++++++++++++-- Tests/TestFiles/InvalidMultiByte.ifc | 36 ++++++++++++++++++++++++++++ Tests/Xbim.Essentials.Tests.csproj | 23 +++++------------- 3 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 Tests/TestFiles/InvalidMultiByte.ifc diff --git a/Tests/ParsingTests.cs b/Tests/ParsingTests.cs index 24842f79c..4f3d2a466 100644 --- a/Tests/ParsingTests.cs +++ b/Tests/ParsingTests.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using FluentAssertions; +using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Diagnostics; @@ -161,7 +162,22 @@ public void ToleratesEmptyMultibyteStringsTest() Assert.AreEqual("Test Test Test", (string)project.Name); } } - + + [TestMethod] + public void ToleratesInvalidMultibyteStringsTest() + { + //Github Issue 605 + using (IfcStore store = IfcStore.Open(@"TestFiles\InvalidMultiByte.ifc")) + { + var prop = store.Instances.OfType().SingleOrDefault(); + prop.Name.Value.Should().BeEquivalentTo("コンクリート体積"); + + prop.NominalValue.Should().BeNull(@"Because \\X2\ is an invalid Unicode marker"); + //prop.NominalValue.Value.Should().BeEquivalentTo(@"file://ATTRIBUTE\コンクリート体積表.XLSX"); + + } + } + [TestMethod] public void IfcStoreOpenAndCloseMemoryModelTest() { diff --git a/Tests/TestFiles/InvalidMultiByte.ifc b/Tests/TestFiles/InvalidMultiByte.ifc new file mode 100644 index 000000000..5f8486151 --- /dev/null +++ b/Tests/TestFiles/InvalidMultiByte.ifc @@ -0,0 +1,36 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('None'),'2;1'); +FILE_NAME('None.ifc','23.03.2018T11:18:44',(' '),(' '),'Some','Windows System',' '); +FILE_SCHEMA(('IFC2X3')); +ENDSEC; +DATA; +#1= IFCORGANIZATION($,'Soft',$,$,$); +#5= IFCAPPLICATION(#1,'Some app','Some app','App'); +#6= IFCPERSON('','','',$,$,$,$,$); +#12= IFCPERSONANDORGANIZATION(#6,#1,$); +#13= IFCOWNERHISTORY(#12,#5,$,.NOCHANGE.,$,$,$,0); +#20= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.); +#21= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.); +#30= IFCUNITASSIGNMENT((#20,#21)); +#40= IFCDIRECTION((1.,0.,0.)); +#41= IFCDIRECTION((0.,1.,0.)); +#42= IFCDIRECTION((0.,0.,1.)); +#45= IFCCARTESIANPOINT((0.,0.,0.)); +#46= IFCDIRECTION((-1.,0.,0.)); +#47= IFCDIRECTION((0.,-1.,0.)); +#48= IFCDIRECTION((0.,0.,-1.)); +#50= IFCAXIS2PLACEMENT3D(#45,#42,#40); +#52= IFCCARTESIANPOINT((0.,0.)); +#53= IFCDIRECTION((1.,0.)); +#54= IFCDIRECTION((-1.,0.)); +#55= IFCDIRECTION((0.,1.)); +#56= IFCDIRECTION((0.,-1.)); +#57= IFCAXIS2PLACEMENT2D(#52,#53); +#60= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-006,#50,$); +#61= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Plan',3,1.E-006,#50,$); +#62= IFCGEOMETRICREPRESENTATIONSUBCONTEXT($,'Plan',*,*,*,*,#61,0.01,.PLAN_VIEW.,$); +#70= IFCPROJECT('2OMYwqOAT2LPGg0QtvgJa2',#13,'Test','','','','',(#60,#61),#30); +#15451=IFCPROPERTYSINGLEVALUE('\X2\30B330F330AF30EA30FC30C84F537A4D\X0\',$,IFCTEXT('file://ATTRIBUTE\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX'),$); +ENDSEC; +END-ISO-10303-21; diff --git a/Tests/Xbim.Essentials.Tests.csproj b/Tests/Xbim.Essentials.Tests.csproj index d79680147..68c7b80a9 100644 --- a/Tests/Xbim.Essentials.Tests.csproj +++ b/Tests/Xbim.Essentials.Tests.csproj @@ -20,15 +20,9 @@ - - - - + - - PreserveNewest - @@ -67,26 +61,21 @@ - Always + PreserveNewest - Always + PreserveNewest - Always + PreserveNewest - Always + PreserveNewest - Always + PreserveNewest - Always - - - - PreserveNewest From 711e1390e362590536c264a25f34b2b463a9c0f7 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Tue, 25 Mar 2025 17:13:45 +0000 Subject: [PATCH 12/16] Fix parsing of invalid escape sequences in string literals (#606) * Updated Step21 Parser (Scanner/Lexer) to more gracefully handle invalid string literal inputs as per #605 #586 etc Refactored the lex code to make more maintainable. Refactored the scanner code gen approach to enable us to retain local fixes to the Scanner Added gplex materials for reference. Documented gplex usage Improved support for multi-line string literals with invalid escaping i.e. IFCLABEL('Text over multiple line without slash X encoding') These may be technically valid but handling them as an edge case creates parsing issues for other more typical classes of errors and edge cases (e.g. unescaped quotes, unescaped backslashes, incorrect \X \S and \P char encoding etc) - because the parser can fail to backtrack until hitting EOF as it attempts to find a valid multi-line terminated string. Essentially one valid unterminated string renders the whole file a failure. By eliminating unencoded CRLF in string literals we fail early affecting only the single entity. * Re-added support for parsing multi-line literal strings Added warning for invalid escaping in strings * Added test to ensure string encoding is correct on output * Added tests for invalid FILE_NAME escaping in header --- .gitignore | 1 + Tests/ParsingTests.cs | 139 +- Tests/Part21FormatterTests.cs | 56 +- Tests/TestFiles/InvalidHeaderFileName.ifc | 11 + Tests/TestFiles/InvalidMultiByte.ifc | 5 +- Tests/TestFiles/NewlinesInStrings.ifc | 2 +- Tests/Xbim.Essentials.Tests.csproj | 2 + Tests/XbimP21StringDecoderTests.cs | 42 + Xbim.Common/Step21/Parser/GPLEXcopyright.rtf | 194 + Xbim.Common/Step21/Parser/GplexBuffers.cs | 727 ++++ Xbim.Common/Step21/Parser/IStepP21Parser.cs | 1 + Xbim.Common/Step21/Parser/MAKEPARSER.BAT | 6 +- Xbim.Common/Step21/Parser/Parser.cs | 1 + Xbim.Common/Step21/Parser/Readme.md | 18 + Xbim.Common/Step21/Parser/Readme.txt | 4 - Xbim.Common/Step21/Parser/StepP21Lex.cs | 3322 ++++++++++-------- Xbim.Common/Step21/Parser/StepP21Lex.lex | 112 +- Xbim.Common/Step21/Parser/StepP21Parser.cs | 352 +- Xbim.Common/Step21/Parser/StepP21Parser.lst | 161 - Xbim.Common/Step21/Parser/StepP21Parser.y | 4 + Xbim.Common/Step21/Parser/XbimScanBuffer.cs | 3 +- Xbim.Common/Step21/Parser/gplex.frame | 605 ++++ Xbim.Common/Step21/Parser/gplex.pdf | Bin 0 -> 728603 bytes Xbim.Common/Step21/StepTextHelper.cs | 12 + Xbim.Common/Step21/XbimP21Parser.cs | 6 + Xbim.Common/Step21/XbimP21Scanner.cs | 32 +- Xbim.IO.Esent/Esent/XbimP21Indexer.cs | 21 +- Xbim.IO.Esent/HeuristicModelProvider.cs | 11 +- 28 files changed, 3932 insertions(+), 1918 deletions(-) create mode 100644 Tests/TestFiles/InvalidHeaderFileName.ifc create mode 100644 Tests/XbimP21StringDecoderTests.cs create mode 100644 Xbim.Common/Step21/Parser/GPLEXcopyright.rtf create mode 100644 Xbim.Common/Step21/Parser/GplexBuffers.cs create mode 100644 Xbim.Common/Step21/Parser/Readme.md delete mode 100644 Xbim.Common/Step21/Parser/Readme.txt delete mode 100644 Xbim.Common/Step21/Parser/StepP21Parser.lst create mode 100644 Xbim.Common/Step21/Parser/gplex.frame create mode 100644 Xbim.Common/Step21/Parser/gplex.pdf diff --git a/.gitignore b/.gitignore index 5b7bca0fe..10633d62c 100644 --- a/.gitignore +++ b/.gitignore @@ -201,3 +201,4 @@ FakesAssemblies/ SharedFileVersionInfo.cs *.jfm *.idea +/Xbim.Common/Step21/Parser/*.lst diff --git a/Tests/ParsingTests.cs b/Tests/ParsingTests.cs index 4f3d2a466..c9daac19d 100644 --- a/Tests/ParsingTests.cs +++ b/Tests/ParsingTests.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using Xbim.Common; +using Xbim.Common.Model; using Xbim.Common.Step21; using Xbim.Ifc; using Xbim.Ifc2x3.SharedBldgElements; @@ -13,6 +14,7 @@ using Xbim.IO; using Xbim.IO.Parser; using Xbim.IO.Step21; +using MeLoggerFactory = Microsoft.Extensions.Logging.LoggerFactory; namespace Xbim.Essentials.Tests { @@ -22,6 +24,8 @@ public class ParsingTests : TestBase private static readonly IEntityFactory ef4 = new Ifc4.EntityFactoryIfc4(); private static readonly IEntityFactory ef2x3 = new Ifc2x3.EntityFactoryIfc2x3(); + + [TestMethod] public void ToleratesFileWithAbstractClass() { @@ -120,7 +124,25 @@ public void ToleratesFileWithInvalidEnumString() Assert.AreEqual(role.Role, IfcRoleEnum.ARCHITECT); } } - + + [TestMethod] + public void ToleratesFileWithInvalidFileName() + { + // Technically FILE_NAME should have escaped backslashes: \\users not \users + using (var s = File.OpenRead(@"TestFiles\InvalidHeaderFileName.ifc")) + { + var header = StepModel.LoadStep21Header(s); + var fileName = header.FileName.Name; + fileName.Should().Be("C:\\Users\\xbim\\myfile.IFC"); + } + + using (var store = IfcStore.Open(@"TestFiles\InvalidHeaderFileName.ifc")) + { + var fileName = store.Header.FileName.Name; + fileName.Should().Be("C:\\Users\\xbim\\myfile.IFC"); + } + } + /// /// This is only provided as a remainder of possible improvements in the tolerance of incorrect files. /// @@ -128,11 +150,15 @@ public void ToleratesFileWithInvalidEnumString() public void AcceptAFormallyIllegalFile() { // todo: should some notification when the file is malformed be available? - using (var store = IfcStore.Open("TestFiles\\FormallyIllegalFile.ifc")) + using var loggerFactory = MeLoggerFactory.Create(b => b.AddConsole()); + + using (var store = new StepModel(new Xbim.Ifc4.EntityFactoryIfc4(), loggerFactory)) { + store.LoadStep21(@"TestFiles\FormallyIllegalFile.ifc"); + // The file is formally illegal, // see inside the file for comments on details. - + // illegal diameter string var st = store.Instances[1] as IIfcPropertySingleValue; var val = (Ifc4.MeasureResource.IfcDescriptiveMeasure)st.NominalValue; @@ -149,7 +175,6 @@ public void AcceptAFormallyIllegalFile() Assert.IsTrue(double.IsNaN(point.Y), "coordinate should be NaN."); Assert.IsTrue(double.IsPositiveInfinity(point.Z), "coordinate should be positive infinity."); - store.Close(); } } @@ -157,7 +182,8 @@ public void AcceptAFormallyIllegalFile() public void ToleratesEmptyMultibyteStringsTest() { // I have stumbled across a file containing empty multibyte string sequences '\X2\\X0\'. - using (IfcStore store = IfcStore.Open(@"TestFiles\EmptyMultibyteString.ifc")) { + using (IfcStore store = IfcStore.Open(@"TestFiles\EmptyMultibyteString.ifc")) + { IIfcProject project = store.Instances.OfType().SingleOrDefault(); Assert.AreEqual("Test Test Test", (string)project.Name); } @@ -167,13 +193,22 @@ public void ToleratesEmptyMultibyteStringsTest() public void ToleratesInvalidMultibyteStringsTest() { //Github Issue 605 - using (IfcStore store = IfcStore.Open(@"TestFiles\InvalidMultiByte.ifc")) + using var loggerFactory = MeLoggerFactory.Create(b => b.AddConsole()); + + using (var model = new StepModel(new Xbim.Ifc2x3.EntityFactoryIfc2x3(), loggerFactory)) { - var prop = store.Instances.OfType().SingleOrDefault(); - prop.Name.Value.Should().BeEquivalentTo("コンクリート体積"); + model.LoadStep21(@"TestFiles\InvalidMultiByte.ifc"); + + var props = model.Instances.OfType(); + props.Should().HaveCount(3); + props.Should().AllSatisfy(prop => + { + prop.Name.Value.ToString().Should().EndWith("コンクリート体積"); + + prop.NominalValue.Should().NotBeNull(@"Because should handle invalid Unicode marker"); + prop.NominalValue.Value.ToString().Should().EndWith(@"\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX", "Invalid encoding"); + }); - prop.NominalValue.Should().BeNull(@"Because \\X2\ is an invalid Unicode marker"); - //prop.NominalValue.Value.Should().BeEquivalentTo(@"file://ATTRIBUTE\コンクリート体積表.XLSX"); } } @@ -204,7 +239,7 @@ public void DefaultsToIfcFormatOnUnrecognisedExtension() [TestMethod] public void IfcStoreOpenAndCloseEsentModelTest() { - using (var store = IfcStore.Open("TestFiles\\4walls1floorSite.ifc", null,0)) + using (var store = IfcStore.Open("TestFiles\\4walls1floorSite.ifc", null, 0)) { var count = store.Instances.Count; Assert.IsTrue(count > 0, "Should have more than zero instances"); @@ -266,23 +301,38 @@ public void DoubleBackSlashName() [TestMethod] public void CanParseNewlinesInStrings() { - using (var model = new Xbim.IO.Memory.MemoryModel( ef2x3)) + using var loggerFactory = MeLoggerFactory.Create(b => b.AddConsole()); + using (var model = new Xbim.IO.Memory.MemoryModel(ef2x3, loggerFactory)) { var errCount = model.LoadStep21("TestFiles\\NewlinesInStrings.ifc"); - Assert.AreEqual(0, errCount); + errCount.Should().Be(0); + model.Header.FileDescription.Description.First().Should().Be("(('ViewDefinition [CoordinationView_V2.0]'),'2;1\r\n')"); + var member = model.Instances.OfType().First(); + member.Name.ToString().Should().Be("L4x4x3/8\r\nB"); } - using (var model = new Xbim.IO.Esent.EsentModel( ef2x3)) + } + + [TestMethod] + public void CanParseNewlinesInStringsEsent() + { + using var loggerFactory = MeLoggerFactory.Create(b => b.AddConsole()); + + using (var model = new Xbim.IO.Esent.EsentModel(ef2x3, loggerFactory)) { - var errCount = model.CreateFrom("TestFiles\\NewlinesInStrings.ifc"); - Assert.AreEqual(true, errCount); + var err = model.CreateFrom("TestFiles\\NewlinesInStrings.ifc", keepOpen: true); + err.Should().Be(true); + model.Header.FileDescription.Description.First().Should().Be("(('ViewDefinition [CoordinationView_V2.0]'),'2;1\r\n')"); + var member = model.Instances.OfType().First(); + member.Name.ToString().Should().Be("L4x4x3/8\r\nB"); } } [TestMethod] public void CanParseSpecicalSolidusEscape() { - using (var model = new Xbim.IO.Memory.MemoryModel(ef2x3)) + using var loggerFactory = MeLoggerFactory.Create(b => b.AddConsole()); + using (var model = new Xbim.IO.Memory.MemoryModel(ef2x3, loggerFactory)) { var errCount = model.LoadStep21("TestFiles\\SpecicalSolidusEscape.ifc"); Assert.AreEqual(0, errCount); @@ -298,7 +348,7 @@ public void IfcOpenIfcZipTest() using (var store = IfcStore.Open("TestFiles\\4walls1floorSite.ifczip")) { count = store.Instances.Count; - Assert.IsTrue(count>0, "Should have instances"); + Assert.IsTrue(count > 0, "Should have instances"); store.Close(); } //esent database @@ -320,10 +370,10 @@ public void ScannerTest() { tok = scanner.yylex(); var txt = scanner.yytext; - Console.WriteLine("Tok={0}, Txt = {1}", Enum.GetName(typeof(Tokens),tok),txt); + Console.WriteLine("Tok={0}, Txt = {1}", Enum.GetName(typeof(Tokens), tok), txt); } - while ( tok!= (int) Tokens.EOF); - } + while (tok != (int)Tokens.EOF); + } } @@ -372,7 +422,7 @@ public void IfcStoreSaveAndOpenIfcZipTest() store.Close(); } using (var store = IfcStore.Open("4walls1floorSiteA.ifczip", null, 0)) - { + { Assert.IsTrue(count == store.Instances.Count, "Should have same number of instances"); store.Close(); } @@ -389,7 +439,7 @@ public void IfcStoreSaveAndOpenIfcZipTest() } } - [TestMethod] + [TestMethod] public void IfcStoreSaveAndOpenIfcXmlZipTest() { long count; @@ -423,17 +473,17 @@ public void IfcStoreSaveAndOpenIfcXmlZipTest() public void IfcStoreSaveAndOpenIfcXml4Test() { int percent = 0; - ReportProgressDelegate progDelegate = delegate(int percentProgress, object userState) + ReportProgressDelegate progDelegate = delegate (int percentProgress, object userState) { percent = percentProgress; }; long count; - - using (var store = IfcStore.Open("TestFiles\\SampleHouse4.ifc", null,-1, progDelegate)) + + using (var store = IfcStore.Open("TestFiles\\SampleHouse4.ifc", null, -1, progDelegate)) { count = store.Instances.Count; - store.SaveAs("SampleHouse4", StorageType.IfcXml); + store.SaveAs("SampleHouse4", StorageType.IfcXml); store.Close(); } using (var store = IfcStore.Open("SampleHouse4.ifcxml", null, -1, progDelegate)) @@ -442,10 +492,10 @@ public void IfcStoreSaveAndOpenIfcXml4Test() store.Close(); } //now with memory model - using (var store = IfcStore.Open("TestFiles\\SampleHouse4.ifc", null,-1,progDelegate)) + using (var store = IfcStore.Open("TestFiles\\SampleHouse4.ifc", null, -1, progDelegate)) { count = store.Instances.Count; - store.SaveAs("SampleHouse4", StorageType.IfcXml); + store.SaveAs("SampleHouse4", StorageType.IfcXml); store.Close(); } using (var store = IfcStore.Open("SampleHouse4.ifcxml")) @@ -466,7 +516,7 @@ public void IfcStoreCreateStoreTest() EditorsOrganisationName = "XbimTeam" }; - using (var store = IfcStore.Create(credentials, XbimSchemaVersion.Ifc2X3,XbimStoreType.EsentDatabase)) + using (var store = IfcStore.Create(credentials, XbimSchemaVersion.Ifc2X3, XbimStoreType.EsentDatabase)) { using (var txn = store.BeginTransaction()) { @@ -524,7 +574,7 @@ public void IfcStoreCreateStoreTest() Assert.IsTrue(schemaVersion == XbimSchemaVersion.Ifc4); } - + [TestMethod] public void ReadIfcHeaderTest() @@ -532,9 +582,9 @@ public void ReadIfcHeaderTest() var modelStore = new HeuristicModelProvider(); var schemaVersion = modelStore.GetXbimSchemaVersion("TestFiles\\SampleHouse4.ifc"); - Assert.IsTrue(schemaVersion==XbimSchemaVersion.Ifc4); + Assert.IsTrue(schemaVersion == XbimSchemaVersion.Ifc4); schemaVersion = modelStore.GetXbimSchemaVersion("TestFiles\\4walls1floorSite.ifc"); - Assert.IsTrue(schemaVersion==XbimSchemaVersion.Ifc2X3); + Assert.IsTrue(schemaVersion == XbimSchemaVersion.Ifc2X3); //first run with a memory model opeing Ifc4 file long count; @@ -556,7 +606,7 @@ public void ReadIfcHeaderTest() Assert.IsTrue(count == store.Instances.Count, "Should have the same number of instances as the memory model"); store.Close(); } - + //now repeat for Ifc2x3 using (var store = IfcStore.Open("TestFiles\\4walls1floorSite.ifc")) { @@ -651,7 +701,7 @@ public void IfcStoreSaveAsXbimTest() long originalCount; using (var ifcStore = IfcStore.Open("TestFiles\\4walls1floorSite.ifc", null, 0)) //test esent databases first { - var count = originalCount = ifcStore.Instances.Count; + var count = originalCount = ifcStore.Instances.Count; Assert.IsTrue(count > 0, "Should have more than zero instances"); //read mode is working ifcStore.SaveAs("4walls1floorSiteDoorES.xbim"); ifcStore.Close(); @@ -717,7 +767,7 @@ public void FileBasedStore_Should_Retain_Saved_XBIM_Files() using (var ifcStore = IfcStore.Open("TestFiles\\4walls1floorSite.ifc", null, 0)) { transientXbimFile = ifcStore.Location; - + ifcStore.SaveAs(savedXBimFile); ifcStore.Close(); } @@ -731,7 +781,7 @@ public void FileBasedStore_Should_Not_retain_Saving_as_Same_file() // Tests a special case - saving a transient xbim over itself // TODO: In theory could make this disable the transient behaviour string transientXbimFile; - + // Load with Esent/File-based store - creates a temp xbim file in %TEMP% using (var ifcStore = IfcStore.Open("TestFiles\\4walls1floorSite.ifc", null, 0)) { @@ -743,7 +793,8 @@ public void FileBasedStore_Should_Not_retain_Saving_as_Same_file() Assert.IsFalse(File.Exists(transientXbimFile)); } - [TestMethod] public void IfcStoreInitialisationTest() + [TestMethod] + public void IfcStoreInitialisationTest() { var credentials = new XbimEditorCredentials { @@ -778,7 +829,6 @@ [TestMethod] public void IfcStoreInitialisationTest() } [TestMethod] - [Ignore("We removed the ability to read illegal step files in order to read legal files with the \"\\S\\'\" sequence, that would otherwise be parsed by the normal backslash,S,backslash sequence, causing an early closure of the string when hitting the \"'\".")] public void EncodeBackslash() { const string path = "C:\\Data\\Martin\\document.txt"; @@ -805,20 +855,20 @@ public void EncodeBackslash() using (var model = IfcStore.Open(test)) { var info = model.Instances.FirstOrDefault(); - Assert.IsTrue(info.Description == path); + info.Description.Value.ToString().Should().Be(path); } } [TestMethod] public void Ifc2x3FinalSchemaTest() { - using (var model = new Xbim.IO.Memory.MemoryModel( ef2x3)) + using (var model = new Xbim.IO.Memory.MemoryModel(ef2x3)) { var errCount = model.LoadStep21("TestFiles\\ifc2x3_final_wall.ifc"); Assert.AreEqual(0, errCount); } - using (var model = new Xbim.IO.Esent.EsentModel( ef2x3)) + using (var model = new Xbim.IO.Esent.EsentModel(ef2x3)) { var errCount = model.CreateFrom("TestFiles\\ifc2x3_final_wall.ifc"); Assert.AreEqual(true, errCount); @@ -834,7 +884,6 @@ public void Parsing_large_entity_label_doesnt_loop() } [TestMethod] - [Ignore("Slow test")] // this is a meta tast of the large stream mock-up public void LargeStreamTest() { @@ -938,13 +987,13 @@ public override int Read(byte[] buffer, int bufferOffset, int count) } // overlap - { + { var spaceCount = (int)(offset - Position); int idx = 0; for (; idx < spaceCount; idx++) buffer[bufferOffset + idx] = (byte)' '; var dataCount = count - spaceCount; - + // adjust var position = Position - offset + spaceCount; if (position != inner.Position) diff --git a/Tests/Part21FormatterTests.cs b/Tests/Part21FormatterTests.cs index 00765ad38..df825edf8 100644 --- a/Tests/Part21FormatterTests.cs +++ b/Tests/Part21FormatterTests.cs @@ -5,19 +5,18 @@ using System.Text; using System.Threading.Tasks; using FluentAssertions; -using Microsoft.VisualStudio.TestTools.UnitTesting; using Xbim.IO.Step21; +using Xunit; namespace Xbim.Essentials.Tests { - [TestClass] public class Part21FormatterTests { public static string fmt = "R"; //public static string fmt = "G"; //public static string fmt = "G17"; - [TestMethod] + [Fact] public void FormatDoubleScientificNotation() { Part21Formatter formatter = new Part21Formatter(); @@ -25,10 +24,10 @@ public void FormatDoubleScientificNotation() string result = formatter.Format(fmt, arg, null); string expected = "5.3E-06"; - Assert.AreEqual(expected, result, "Wrong conversion!"); + result.Should().Be(expected); } - [TestMethod] + [Fact] public void FormatDoubleScientificNotationRoundTrip() { Part21Formatter formatter = new Part21Formatter(); @@ -36,10 +35,10 @@ public void FormatDoubleScientificNotationRoundTrip() string result = formatter.Format(fmt, arg, null); var roundTripDbl = double.Parse(result, new CultureInfo("en-US", false)); - Assert.AreEqual(arg, roundTripDbl, "Wrong conversion!"); + roundTripDbl.Should().Be(arg); } - [TestMethod] + [Fact] public void FormatDouble() { Part21Formatter formatter = new Part21Formatter(); @@ -47,10 +46,10 @@ public void FormatDouble() string result = formatter.Format(fmt, arg, null); string expected = "-12345678.5323"; - Assert.AreEqual(expected, result, "Wrong conversion!"); + result.Should().Be(expected); } - [TestMethod] + [Fact] public void FormatDoubleRoundTrip() { Part21Formatter formatter = new Part21Formatter(); @@ -58,10 +57,10 @@ public void FormatDoubleRoundTrip() string result = formatter.Format(fmt, arg, null); var roundTripDbl = double.Parse(result, new CultureInfo("en-US", false)); - Assert.AreEqual(arg, roundTripDbl, "Wrong conversion!"); + roundTripDbl.Should().Be(arg); } - [TestMethod] + [Fact] public void FormatDoubleLargeDecimal() { Part21Formatter formatter = new Part21Formatter(); @@ -71,10 +70,10 @@ public void FormatDoubleLargeDecimal() string result = formatter.Format(fmt, arg, null); string expected = "0.84551240822557"; // Last digits of double are truncated - Assert.AreEqual(expected, result, "Wrong conversion!"); + result.Should().Be(expected); } - [TestMethod] + [Fact] public void FormatDoubleLargeDecimalRoundTrip() { Part21Formatter formatter = new Part21Formatter(); @@ -88,7 +87,7 @@ public void FormatDoubleLargeDecimalRoundTrip() roundTripDbl.Should().BeApproximately(arg, 0.000000000000001); } - [TestMethod] + [Fact] public void FormatDoubleWithoutDecimal() { Part21Formatter formatter = new Part21Formatter(); @@ -96,10 +95,10 @@ public void FormatDoubleWithoutDecimal() string result = formatter.Format(fmt, arg, null); string expected = "-12345678."; - Assert.AreEqual(expected, result, "Wrong conversion!"); + result.Should().Be(expected); } - [TestMethod] + [Fact] public void FormatDoubleWithoutDecimalRoundTrip() { Part21Formatter formatter = new Part21Formatter(); @@ -107,10 +106,10 @@ public void FormatDoubleWithoutDecimalRoundTrip() string result = formatter.Format(fmt, arg, null); var roundTripDbl = double.Parse(result, new CultureInfo("en-US", false)); - Assert.AreEqual(arg, roundTripDbl, "Wrong conversion!"); + roundTripDbl.Should().Be(arg); } - [TestMethod] + [Fact] public void FormatDoubleWithoutDecimalLarge() { Part21Formatter formatter = new Part21Formatter(); @@ -118,10 +117,10 @@ public void FormatDoubleWithoutDecimalLarge() string result = formatter.Format(fmt, arg, null); string expected = "-1234567812345678."; - Assert.AreEqual(expected, result, "Wrong conversion!"); + result.Should().Be(expected); } - [TestMethod] + [Fact] public void FormatDoubleWithoutDecimalLargeRoundTrip() { Part21Formatter formatter = new Part21Formatter(); @@ -129,7 +128,22 @@ public void FormatDoubleWithoutDecimalLargeRoundTrip() string result = formatter.Format(fmt, arg, null); var roundTripDbl = double.Parse(result, new CultureInfo("en-US", false)); - Assert.AreEqual(arg, roundTripDbl, "Wrong conversion!"); + roundTripDbl.Should().Be(arg); + } + + [InlineData(@"hôtel", @"'h\X\F4tel'")] + [InlineData(@"Zôë", @"'Z\X\F4\X\EB'")] + [InlineData("Multi\r\nLine", @"'Multi\X\0D\X\0ALine'")] + [InlineData(@"コンクリート体積", @"'\X2\30B330F330AF30EA30FC30C84F537A4D\X0\'")] + [InlineData(@"Emôji👍😄⬆️", @"'Em\X\F4ji\X4\0001F44D0001F604\X0\\X2\2B06FE0F\X0\'")] + [Theory] + public void FormatStringAsCorrectEncoding(string input, string expected) + { + Part21Formatter formatter = new Part21Formatter(); + + string result = formatter.Format(fmt, input, null); + + result.Should().Be(expected); } } } \ No newline at end of file diff --git a/Tests/TestFiles/InvalidHeaderFileName.ifc b/Tests/TestFiles/InvalidHeaderFileName.ifc new file mode 100644 index 000000000..b64907b3d --- /dev/null +++ b/Tests/TestFiles/InvalidHeaderFileName.ifc @@ -0,0 +1,11 @@ +ISO-10303-21; +HEADER; +FILE_SCHEMA(('IFC2X3')); +FILE_NAME('C:\Users\xbim\myfile.IFC','2012-01-01T09:00:00',('User'),('A',''),'v3','W',''); +ENDSEC; + +DATA; +#1= IFCORGANIZATION($,'xbim',$,$,$); +ENDSEC; + +END-ISO-10303-21; diff --git a/Tests/TestFiles/InvalidMultiByte.ifc b/Tests/TestFiles/InvalidMultiByte.ifc index 5f8486151..f2e629238 100644 --- a/Tests/TestFiles/InvalidMultiByte.ifc +++ b/Tests/TestFiles/InvalidMultiByte.ifc @@ -31,6 +31,9 @@ DATA; #61= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Plan',3,1.E-006,#50,$); #62= IFCGEOMETRICREPRESENTATIONSUBCONTEXT($,'Plan',*,*,*,*,#61,0.01,.PLAN_VIEW.,$); #70= IFCPROJECT('2OMYwqOAT2LPGg0QtvgJa2',#13,'Test','','','','',(#60,#61),#30); -#15451=IFCPROPERTYSINGLEVALUE('\X2\30B330F330AF30EA30FC30C84F537A4D\X0\',$,IFCTEXT('file://ATTRIBUTE\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX'),$); +#15451=IFCPROPERTYSINGLEVALUE('1\X2\30B330F330AF30EA30FC30C84F537A4D\X0\',$,IFCTEXT('file://ATTRIBUTE1\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX'),$); +#15452=IFCPROPERTYSINGLEVALUE('2\X2\30B330F330AF30EA30FC30C84F537A4D\X0\',$,IFCTEXT('file://ATTRIBUTE2\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX'),$); +#15453=IFCPROPERTYSINGLEVALUE('3\X2\30B330F330AF30EA30FC30C84F537A4D\X0\',$,IFCTEXT('file://ATTRIBUTE3\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\-\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX'),$); +#80= IFCPERSON('Person 2','','',$,$,$,$,$); ENDSEC; END-ISO-10303-21; diff --git a/Tests/TestFiles/NewlinesInStrings.ifc b/Tests/TestFiles/NewlinesInStrings.ifc index b8de34d0d..7c9804b33 100644 --- a/Tests/TestFiles/NewlinesInStrings.ifc +++ b/Tests/TestFiles/NewlinesInStrings.ifc @@ -27,7 +27,7 @@ DATA; #315798=IFCCARTESIANTRANSFORMATIONOPERATOR2D(#1031933,#1031934,#592820,1.); #315817=IFCLSHAPEPROFILEDEF(.AREA.,'L4x4x3/8',#532246,4.,4.,0.375,0.1875,0.,0.,0.,0.); #323449=IFCMEMBER('1dfYC_zFP2lAeDUw6iqQ4Q',#533255,'L4x4x3/8 -','L4x4x3/8','Cleat',#534050,#405734,$); +B','L4x4x3/8','Cleat',#534050,#405734,$); #405734=IFCPRODUCTDEFINITIONSHAPE($,$,(#459888)); #436295=IFCMAPPEDITEM(#447715,#501238); #447715=IFCREPRESENTATIONMAP(#567200,#459887); diff --git a/Tests/Xbim.Essentials.Tests.csproj b/Tests/Xbim.Essentials.Tests.csproj index 68c7b80a9..9b183d1c8 100644 --- a/Tests/Xbim.Essentials.Tests.csproj +++ b/Tests/Xbim.Essentials.Tests.csproj @@ -27,9 +27,11 @@ + + diff --git a/Tests/XbimP21StringDecoderTests.cs b/Tests/XbimP21StringDecoderTests.cs new file mode 100644 index 000000000..2db078d2d --- /dev/null +++ b/Tests/XbimP21StringDecoderTests.cs @@ -0,0 +1,42 @@ +using FluentAssertions; +using Xbim.IO.Step21; +using Xunit; + +namespace Xbim.Essentials.Tests +{ + public class XbimP21StringDecoderTests + { + [InlineData("", "")] + [InlineData("''", "'")] + [InlineData("'Acme'", "'Acme'")] + [InlineData("O''Leary", "O'Leary")] + [InlineData("O'Leary", "O'Leary")] + [InlineData(@"http://foo.bar.com/Abc?c=d", "http://foo.bar.com/Abc?c=d")] + [InlineData(@"\S\Drger", @"Ärger")] // D = 0x44. 0x44 + 0x80(top bit) = 0xC4 => Ä (in ISO-8859-1) + [InlineData(@"h\S\ttel", @"hôtel")] // t = 0x74. + 0x80 => 0xF4 = ô (in ISO-8859-1) + [InlineData(@"\PA\h\S\ttel", @"hôtel")] // t = 0x74. + 0x80 => 0xF4 = ô (in ISO-8859-1) - Explicitly state 8859-1 codepage + [InlineData(@"\PE\h\S\ttel", @"hєtel")] // t = 0x74. + 0x80 => 0xF4 = є (in ISO-8859-5) P*E* => 5th 8859 codepage (Cyrillic) + [InlineData(@"\X2\30B330F330AF30EA30FC30C84F537A4D\X0\", "コンクリート体積")] + [InlineData(@"file://ATTRIBUTE\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX", @"file://ATTRIBUTEコンクリート体積表.XLSX")] + [InlineData(@"file://ATTRIBUTE/\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX", @"file://ATTRIBUTE/コンクリート体積表.XLSX")] + [InlineData(@"file://ATTRIBUTE\\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX", @"file://ATTRIBUTE\コンクリート体積表.XLSX")] + [InlineData(@"file://ATTRIBUTE\\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX", + @"file://ATTRIBUTE\X2\30B330F330AF30EA30FC30C84F537A4D8868\X0\.XLSX")] // Invalid encoding. Only \\ un-escaped + [InlineData(@"F:\\Dropbox\\00 - ndBIM_Coordena\S\C\S\'\S\C\S\#o\\01 - Parcerias Comerciais\\YellowBox\\2015-09-24\\IFC\\ARQ.ifc", + @"F:\Dropbox\00 - ndBIM_Coordenação\01 - Parcerias Comerciais\YellowBox\2015-09-24\IFC\ARQ.ifc")] + [InlineData(@"Em\X\F4ji\X4\0001F44D0001F604\X0\\X2\2B06FE0F\X0\", @"Emôji👍😄⬆️")] + + [Theory] + public void CanDecodeString(string p21input, string expectedOutput) + { + var decoder = new XbimP21StringDecoder(); + + var result = decoder.Unescape(p21input); + + result.Should().Be(expectedOutput); + + } + } +} + + diff --git a/Xbim.Common/Step21/Parser/GPLEXcopyright.rtf b/Xbim.Common/Step21/Parser/GPLEXcopyright.rtf new file mode 100644 index 000000000..2408050f0 --- /dev/null +++ b/Xbim.Common/Step21/Parser/GPLEXcopyright.rtf @@ -0,0 +1,194 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang3081\deflangfe3081\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f49\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f50\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\f52\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f53\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f55\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f56\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f49\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f50\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\f52\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f53\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f55\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f56\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \fs22 }{\*\defpap +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 +\ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af1\afs32\alang1025 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\kerning32\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat heading 1;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang3081\langfe3081\cgrid\langnp3081\langfenp3081 \snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive +\rtlch\fcs1 \ab\af31503\afs32 \ltrch\fcs0 \b\fs32\kerning32\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 Heading 1 Char;}}{\*\listtable{\list\listtemplateid-1508889896\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698703\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2 +\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel +\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 } +{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-180\li4320\jclisttab\tx4320\lin4320 +}{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \hres0\chhres0 +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\hres0\chhres0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1123961876}}{\*\listoverridetable{\listoverride\listid1123961876\listoverridecount0\ls1}}{\*\rsidtbl \rsid397295\rsid799859\rsid8072280\rsid8993829\rsid9001816\rsid13269757 +\rsid13636981}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\title Gardens Point Component Pascal Copyright}{\author gough}{\operator john} +{\creatim\yr2005\mo2\dy15\hr17\min18}{\revtim\yr2014\mo8\dy24\hr8\min57}{\version8}{\edmins11}{\nofpages1}{\nofwords268}{\nofchars1481}{\*\company Faculty of Information Technology}{\nofcharsws1746}{\vern32774}}{\*\xmlnstbl {\xmlns1 http://schemas.microso +ft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale117\viewzk2\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\rsidroot9001816 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0\ltrpar \sectd \ltrsect +\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (} +{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs32\alang1025 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\kerning32\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 +\af1 \ltrch\fcs0 \insrsid397295 Gardens Point }{\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid13269757 LEX}{\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid9001816 Copyright +\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9001816 + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid397295 Copyright}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13269757 \'a9}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid397295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13269757 2006}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8993829 +-2014}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9001816 Queensland University of Technology (QUT). All rights reserved. +\par +\par Redistribution and use in source and binary forms, with or without modification are permitted provided that the following conditions are met: +\par +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1033\langnp1033\langfenp1033\insrsid9001816 \hich\af0\dbch\af0\loch\f0 1.\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9001816 Redistribution of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1033\langnp1033\langfenp1033\insrsid9001816 \hich\af0\dbch\af0\loch\f0 2.\tab} +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials with the distribution. +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9001816 +\par THIS }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid397295 SOFTWARE IS PROVIDED BY THE }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13269757 GPLEX}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9001816 PROJECT \'93AS IS\rquote + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE HEREBY DISCLA}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid397295 IMED. IN NO EVENT SHALL THE GPPG}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9001816 + PROJECT OR QUT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTI +ON) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\par +\par The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either e}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid397295 xpressed or implied, of the }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13269757 GPLEX}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9001816 project or QUT. +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8993829 +\par Explanatory note: the source code of GPLEX is copyright, as stated above. The }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8993829\charrsid8993829 outputs}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8993829 produced by running GPLEX over + lexical specifications are the property of the specification owner and QUT makes no claim on such outputs. +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdunhideused0 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f000000000000000000000000f0e4 +c19925bfcf01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/Xbim.Common/Step21/Parser/GplexBuffers.cs b/Xbim.Common/Step21/Parser/GplexBuffers.cs new file mode 100644 index 000000000..b8f21c2e3 --- /dev/null +++ b/Xbim.Common/Step21/Parser/GplexBuffers.cs @@ -0,0 +1,727 @@ +// ============================================================== +// +// This code automatically produced from an embedded resource. +// Do not edit this file, or it will become incompatible with +// the specification from which it was generated. +// +// ============================================================== + +// This file belongs to GPLEX but has been manually edited to incorporate edits from Step21Lex.cs in +// https://github.com/xBimTeam/XbimEssentials/commit/6517bc16042b3cfd820dd7eb45f72bbab92d13ad +// e.g. Pos is now long rather than int to support files > 2GB +// This file should not be checked in on regeneration of the Scanner/Parser +// In the event we upgrade gplex it will require updating. +// See Readme.md for more info + +using System; +using System.IO; +using System.Text; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.Serialization; +using System.Globalization; + +namespace QUT.GplexBuffers +{ +// Code copied from GPLEX embedded resource + [Serializable] + public class BufferException : Exception + { + public BufferException() { } + public BufferException(string message) : base(message) { } + public BufferException(string message, Exception innerException) + : base(message, innerException) { } + } + + public abstract class ScanBuff + { + private string fileNm; + + public const int EndOfFile = -1; + public const int UnicodeReplacementChar = 0xFFFD; + + public bool IsFile { get { return (fileNm != null); } } + public string FileName { get { return fileNm; } set { fileNm = value; } } + + public abstract long Pos { get; set; } + public abstract int Read(); + public virtual void Mark() { } + + public abstract string GetString(long begin, long limit); + + public static ScanBuff GetBuffer(string source) + { + return new StringBuffer(source); + } + + public static ScanBuff GetBuffer(IList source) + { + return new LineBuffer(source); + } + +#if (!NOFILES) + public static ScanBuff GetBuffer(Stream source) + { + return new BuildBuffer(source); + } + +#if (!BYTEMODE) + public static ScanBuff GetBuffer(Stream source, int fallbackCodePage) + { + return new BuildBuffer(source, fallbackCodePage); + } +#endif // !BYTEMODE +#endif // !NOFILES + } + + #region Buffer classes + + // ============================================================== + // ===== Definitions for various ScanBuff derived classes ==== + // ============================================================== + // =============== String input ================ + // ============================================================== + + /// + /// This class reads characters from a single string as + /// required, for example, by Visual Studio language services + /// + sealed class StringBuffer : ScanBuff + { + string str; // input buffer + long bPos; // current position in buffer + int sLen; + + public StringBuffer(string source) + { + this.str = source; + this.sLen = source.Length; + this.FileName = null; + } + + public override int Read() + { + if (bPos < sLen) return str[(int)bPos++]; + else if (bPos == sLen) { bPos++; return '\n'; } // one strike, see new line + else { bPos++; return EndOfFile; } // two strikes and you're out! + } + + public override string GetString(long begin, long limit) + { + // "limit" can be greater than sLen with the BABEL + // option set. Read returns a "virtual" EOL if + // an attempt is made to read past the end of the + // string buffer. Without the guard any attempt + // to fetch yytext for a token that includes the + // EOL will throw an index exception. + if (limit > sLen) limit = sLen; + if (limit <= begin) return ""; + else return str.Substring((int)begin, (int)(limit - begin)); + } + + public override long Pos + { + get { return bPos; } + set { bPos = value; } + } + + public override string ToString() { return "StringBuffer"; } + } + + // ============================================================== + // The LineBuff class contributed by Nigel Horspool, + // nigelh@cs.uvic.cs + // ============================================================== + + sealed class LineBuffer : ScanBuff + { + IList line; // list of source lines from a file + int numLines; // number of strings in line list + string curLine; // current line in that list + int cLine; // index of current line in the list + int curLen; // length of current line + long curLineStart; // position of line start in whole file + long curLineEnd; // position of line end in whole file + long maxPos; // max position ever visited in whole file + long cPos; // ordinal number of code in source + + // Constructed from a list of strings, one per source line. + // The lines have had trailing '\n' characters removed. + public LineBuffer(IList lineList) + { + line = lineList; + numLines = line.Count; + cPos = curLineStart = 0; + curLine = (numLines > 0 ? line[0] : ""); + maxPos = curLineEnd = curLen = curLine.Length; + cLine = 1; + FileName = null; + } + + public override int Read() + { + if (cPos < curLineEnd) + return curLine[(int)(cPos++ - curLineStart)]; + if (cPos++ == curLineEnd) + return '\n'; + if (cLine >= numLines) + return EndOfFile; + curLine = line[cLine]; + curLen = curLine.Length; + curLineStart = curLineEnd + 1; + curLineEnd = curLineStart + curLen; + if (curLineEnd > maxPos) + maxPos = curLineEnd; + cLine++; + return curLen > 0 ? curLine[0] : '\n'; + } + + // To speed up searches for the line containing a position + private long cachedPosition; + private long cachedLineStart; + private int cachedIxdex; + + // Given a position pos within the entire source, the results are + // ix -- the index of the containing line + // lstart -- the position of the first character on that line + private void findIndex(long pos, out int ix, out long lstart) + { + if (pos >= cachedPosition) + { + ix = cachedIxdex; lstart = cachedLineStart; + } + else + { + ix = 0; + lstart = 0; + } + while (ix < numLines) + { + int len = line[ix].Length + 1; + if (pos < lstart + len) break; + lstart += len; + ix++; + } + cachedPosition = pos; + cachedIxdex = ix; + cachedLineStart = lstart; + } + + public override string GetString(long begin, long limit) + { + if (begin >= maxPos || limit <= begin) return ""; + int endIx, begIx; + long begLineStart, endLineStart; + findIndex(begin, out begIx, out begLineStart); + int begCol = (int)(begin - begLineStart); + findIndex(limit, out endIx, out endLineStart); + int endCol = (int)(limit - endLineStart); + string s = line[begIx]; + if (begIx == endIx) + { + // the usual case, substring all on one line + return (endCol <= s.Length) ? + s.Substring(begCol, endCol - begCol) + : s.Substring(begCol) + "\n"; + } + // the string spans multiple lines, yuk! + StringBuilder sb = new StringBuilder(); + if (begCol < s.Length) + sb.Append(s.Substring(begCol)); + for (; ; ) + { + sb.Append("\n"); + s = line[++begIx]; + if (begIx >= endIx) break; + sb.Append(s); + } + if (endCol <= s.Length) + { + sb.Append(s.Substring(0, endCol)); + } + else + { + sb.Append(s); + sb.Append("\n"); + } + return sb.ToString(); + } + + public override long Pos + { + get { return cPos; } + set + { + cPos = value; + findIndex(cPos, out cLine, out curLineStart); + // cLine should be the *next* line after curLine. + curLine = (cLine < numLines ? line[cLine++] : ""); + curLineEnd = curLineStart + curLine.Length; + } + } + + public override string ToString() { return "LineBuffer"; } + } + +#if (!NOFILES) + // ============================================================== + // ===== class BuildBuff : for unicode text files ======== + // ============================================================== + + class BuildBuffer : ScanBuff + { + // Double buffer for char stream. + class BufferElement + { + StringBuilder bldr = new StringBuilder(); + StringBuilder next = new StringBuilder(); + long minIx; + long maxIx; + long brkIx; + bool appendToNext; + + internal BufferElement() { } + + internal long MaxIndex { get { return maxIx; } } + // internal int MinIndex { get { return minIx; } } + + internal char this[long index] + { + get + { + if (index < minIx || index >= maxIx) + throw new BufferException("Index was outside data buffer"); + else if (index < brkIx) + return bldr[(int)(index - minIx)]; + else + return next[(int)(index - brkIx)]; + } + } + + internal void Append(char[] block, int count) + { + maxIx += count; + if (appendToNext) + this.next.Append(block, 0, count); + else + { + this.bldr.Append(block, 0, count); + brkIx = maxIx; + appendToNext = true; + } + } + + internal string GetString(long start, long limit) + { + if (limit <= start) + return ""; + if (start >= minIx && limit <= maxIx) + if (limit < brkIx) // String entirely in bldr builder + return bldr.ToString((int)(start - minIx), (int)(limit - start)); + else if (start >= brkIx) // String entirely in next builder + return next.ToString((int)(start - brkIx), (int)(limit - start)); + else // Must do a string-concatenation + return + bldr.ToString((int)(start - minIx), (int)(brkIx - start)) + + next.ToString(0, (int)(limit - brkIx)); + else + throw new BufferException("String was outside data buffer"); + } + + internal void Mark(long limit) + { + if (limit > brkIx + 16) // Rotate blocks + { + StringBuilder temp = bldr; + bldr = next; + next = temp; + next.Length = 0; + minIx = brkIx; + brkIx = maxIx; + } + } + } + + BufferElement data = new BufferElement(); + + long bPos; // Postion index in the StringBuilder + BlockReader NextBlk; // Delegate that serves char-arrays; + + private string EncodingName + { + get + { + StreamReader rdr = NextBlk.Target as StreamReader; + return (rdr == null ? "raw-bytes" : rdr.CurrentEncoding.BodyName); + } + } + + public BuildBuffer(Stream stream) + { + FileStream fStrm = (stream as FileStream); + if (fStrm != null) FileName = fStrm.Name; + NextBlk = BlockReaderFactory.Raw(stream); + } + +#if (!BYTEMODE) + public BuildBuffer(Stream stream, int fallbackCodePage) + { + FileStream fStrm = (stream as FileStream); + if (fStrm != null) FileName = fStrm.Name; + NextBlk = BlockReaderFactory.Get(stream, fallbackCodePage); + } +#endif + + /// + /// Marks a conservative lower bound for the buffer, + /// allowing space to be reclaimed. If an application + /// needs to call GetString at arbitrary past locations + /// in the input stream, Mark() is not called. + /// + public override void Mark() { data.Mark(bPos - 2); } + + public override long Pos + { + get { return bPos; } + set { bPos = value; } + } + + + /// + /// Read returns the ordinal number of the next char, or + /// EOF (-1) for an end of stream. Note that the next + /// code point may require *two* calls of Read(). + /// + /// + public override int Read() + { + // + // Characters at positions + // [data.offset, data.offset + data.bldr.Length) + // are available in data.bldr. + // + if (bPos < data.MaxIndex) + { + // ch0 cannot be EOF + return (int)data[bPos++]; + } + else // Read from underlying stream + { + // Experimental code, blocks of page size + char[] chrs = new char[4096]; + int count = NextBlk(chrs, 0, 4096); + if (count == 0) + return EndOfFile; + else + { + data.Append(chrs, count); + return (int)data[bPos++]; + } + } + } + + public override string GetString(long begin, long limit) + { + return data.GetString(begin, limit); + } + + public override string ToString() + { + return "StringBuilder buffer, encoding: " + this.EncodingName; + } + } + + // =============== End ScanBuff-derived classes ================== + + public delegate int BlockReader(char[] block, int index, int number); + + // A delegate factory, serving up a delegate that + // reads a block of characters from the underlying + // encoded stream, via a StreamReader object. + // + public static class BlockReaderFactory + { + public static BlockReader Raw(Stream stream) + { + return delegate(char[] block, int index, int number) + { + byte[] b = new byte[number]; + int count = stream.Read(b, 0, number); + int i = 0; + int j = index; + for (; i < count; i++, j++) + block[j] = (char)b[i]; + return count; + }; + } + +#if (!BYTEMODE) + public static BlockReader Get(Stream stream, int fallbackCodePage) + { + Encoding encoding; + int preamble = Preamble(stream); + + if (preamble != 0) // There is a valid BOM here! + encoding = Encoding.GetEncoding(preamble); + else if (fallbackCodePage == -1) // Fallback is "raw" bytes + return Raw(stream); + else if (fallbackCodePage != -2) // Anything but "guess" + encoding = Encoding.GetEncoding(fallbackCodePage); + else // This is the "guess" option + { + int guess = new Guesser(stream).GuessCodePage(); + stream.Seek(0, SeekOrigin.Begin); + if (guess == -1) // ==> this is a 7-bit file + encoding = Encoding.ASCII; + else if (guess == 65001) + encoding = Encoding.UTF8; + else // ==> use the machine default + encoding = Encoding.Default; + } + StreamReader reader = new StreamReader(stream, encoding); + return reader.Read; + } + + static int Preamble(Stream stream) + { + int b0 = stream.ReadByte(); + int b1 = stream.ReadByte(); + + if (b0 == 0xfe && b1 == 0xff) + return 1201; // UTF16BE + if (b0 == 0xff && b1 == 0xfe) + return 1200; // UTF16LE + + int b2 = stream.ReadByte(); + if (b0 == 0xef && b1 == 0xbb && b2 == 0xbf) + return 65001; // UTF8 + // + // There is no unicode preamble, so we + // return denoter for the machine default. + // + stream.Seek(0, SeekOrigin.Begin); + return 0; + } +#endif // !BYTEMODE + } +#endif // !NOFILES + #endregion Buffer classes + + // ============================================================== + // ============ class CodePageHandling ============= + // ============================================================== +#if (!NOFILES) + public static class CodePageHandling + { + public static int GetCodePage(string option) + { + string command = option.ToUpperInvariant(); + if (command.StartsWith("CodePage:", StringComparison.OrdinalIgnoreCase)) + command = command.Substring(9); + try + { + if (command.Equals("RAW")) + return -1; + else if (command.Equals("GUESS")) + return -2; + else if (command.Equals("DEFAULT")) + return 0; + else if (char.IsDigit(command[0])) + return int.Parse(command, CultureInfo.InvariantCulture); + else + { + Encoding enc = Encoding.GetEncoding(command); + return enc.CodePage; + } + } + catch (FormatException) + { + Console.Error.WriteLine( + "Invalid format \"{0}\", using machine default", option); + } + catch (ArgumentException) + { + Console.Error.WriteLine( + "Unknown code page \"{0}\", using machine default", option); + } + return 0; + } + } +#region guesser +#if (!BYTEMODE) + // ============================================================== + // ============ Encoding Guesser ============= + // ============================================================== + + /// + /// This class provides a simple finite state automaton that + /// scans the file looking for (1) valid UTF-8 byte patterns, + /// (2) bytes >= 0x80 which are not part of a UTF-8 sequence. + /// The method then guesses whether it is UTF-8 or maybe some + /// local machine default encoding. This works well for the + /// various Latin encodings. + /// + internal class Guesser + { + ScanBuff buffer; + + public int GuessCodePage() { return Scan(); } + + const int maxAccept = 10; + const int initial = 0; + const int eofNum = 0; + const int goStart = -1; + const int INITIAL = 0; + const int EndToken = 0; + + #region user code + /* + * Reads the bytes of a file to determine if it is + * UTF-8 or a single-byte code page file. + */ + public long utfX; + public long uppr; + #endregion user code + + int state; + int currentStart = startState[0]; + int code; + + #region ScannerTables + static int[] startState = new int[] { 11, 0 }; + + #region CharacterMap + static sbyte[] map = new sbyte[256] { +/* '\0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* '\x10' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* '\x20' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* '0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* '@' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 'P' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* '`' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 'p' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* '\x80' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* '\x90' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* '\xA0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* '\xB0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* '\xC0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* '\xD0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* '\xE0' */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +/* '\xF0' */ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5 }; + #endregion + + static sbyte[][] nextState = new sbyte[][] { + new sbyte[] {0, 0, 0, 0, 0, 0}, + new sbyte[] {-1, -1, 10, -1, -1, -1}, + new sbyte[] {-1, -1, -1, -1, -1, -1}, + new sbyte[] {-1, -1, 8, -1, -1, -1}, + new sbyte[] {-1, -1, 5, -1, -1, -1}, + new sbyte[] {-1, -1, 6, -1, -1, -1}, + new sbyte[] {-1, -1, 7, -1, -1, -1}, + null, + new sbyte[] {-1, -1, 9, -1, -1, -1}, + null, + null, + new sbyte[] {-1, 1, 2, 3, 4, 2} + }; + + + [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] + // Reason for suppression: cannot have self-reference in array initializer. + static Guesser() + { + nextState[7] = nextState[2]; + nextState[9] = nextState[2]; + nextState[10] = nextState[2]; + } + + int NextState() + { + if (code == ScanBuff.EndOfFile) + return eofNum; + else + return nextState[state][map[code]]; + } + #endregion + + public Guesser(System.IO.Stream file) { SetSource(file); } + + public void SetSource(System.IO.Stream source) + { + this.buffer = new BuildBuffer(source); + code = buffer.Read(); + } + + int Scan() + { + for (; ; ) + { + int next; + state = currentStart; + while ((next = NextState()) == goStart) + code = buffer.Read(); + + state = next; + code = buffer.Read(); + + while ((next = NextState()) > eofNum) + { + state = next; + code = buffer.Read(); + } + if (state <= maxAccept) + { + #region ActionSwitch +#pragma warning disable 162 + switch (state) + { + case eofNum: + switch (currentStart) + { + case 11: + if (utfX == 0 && uppr == 0) return -1; /* raw ascii */ + else if (uppr * 10 > utfX) return 0; /* default code page */ + else return 65001; /* UTF-8 encoding */ + break; + } + return EndToken; + case 1: // Recognized '{Upper128}', Shortest string "\xC0" + case 2: // Recognized '{Upper128}', Shortest string "\x80" + case 3: // Recognized '{Upper128}', Shortest string "\xE0" + case 4: // Recognized '{Upper128}', Shortest string "\xF0" + uppr++; + break; + case 5: // Recognized '{Utf8pfx4}{Utf8cont}', Shortest string "\xF0\x80" + uppr += 2; + break; + case 6: // Recognized '{Utf8pfx4}{Utf8cont}{2}', Shortest string "\xF0\x80\x80" + uppr += 3; + break; + case 7: // Recognized '{Utf8pfx4}{Utf8cont}{3}', Shortest string "\xF0\x80\x80\x80" + utfX += 3; + break; + case 8: // Recognized '{Utf8pfx3}{Utf8cont}', Shortest string "\xE0\x80" + uppr += 2; + break; + case 9: // Recognized '{Utf8pfx3}{Utf8cont}{2}', Shortest string "\xE0\x80\x80" + utfX += 2; + break; + case 10: // Recognized '{Utf8pfx2}{Utf8cont}', Shortest string "\xC0\x80" + utfX++; + break; + default: + break; + } +#pragma warning restore 162 + #endregion + } + } + } + } // end class Guesser + +#endif // !BYTEMODE +#endregion +#endif // !NOFILES + +// End of code copied from embedded resource +} diff --git a/Xbim.Common/Step21/Parser/IStepP21Parser.cs b/Xbim.Common/Step21/Parser/IStepP21Parser.cs index 039d5d2be..2a6a64781 100644 --- a/Xbim.Common/Step21/Parser/IStepP21Parser.cs +++ b/Xbim.Common/Step21/Parser/IStepP21Parser.cs @@ -37,6 +37,7 @@ internal interface IStepP21Parser void SetHexValue(string value); void SetFloatValue(string value); void SetStringValue(string value); + void SetInvalidStringValue(string value); void SetEnumValue(string value); void SetBooleanValue(string value); void SetNonDefinedValue(); diff --git a/Xbim.Common/Step21/Parser/MAKEPARSER.BAT b/Xbim.Common/Step21/Parser/MAKEPARSER.BAT index 6ec26912f..029acc633 100644 --- a/Xbim.Common/Step21/Parser/MAKEPARSER.BAT +++ b/Xbim.Common/Step21/Parser/MAKEPARSER.BAT @@ -1,4 +1,6 @@ cd %1 -GPLEX /noPersistBuffer StepP21Lex.LEX +GPLEX /noPersistBuffer /noEmbedBuffers /frame:gplex.frame StepP21Lex.LEX GPPG /gplex StepP21Parser.y > StepP21Parser.cs -pause \ No newline at end of file + +git restore GplexBuffers.cs +pause diff --git a/Xbim.Common/Step21/Parser/Parser.cs b/Xbim.Common/Step21/Parser/Parser.cs index 24f92ef36..a56676b1f 100644 --- a/Xbim.Common/Step21/Parser/Parser.cs +++ b/Xbim.Common/Step21/Parser/Parser.cs @@ -190,6 +190,7 @@ protected virtual void SetErrorMessage() protected abstract void SetHexValue(string value); protected abstract void SetFloatValue(string value); protected abstract void SetStringValue(string value); + protected abstract void SetInvalidStringValue(string value); protected abstract void SetEnumValue(string value); protected abstract void SetBooleanValue(string value); protected abstract void SetNonDefinedValue(); diff --git a/Xbim.Common/Step21/Parser/Readme.md b/Xbim.Common/Step21/Parser/Readme.md new file mode 100644 index 000000000..9358fa646 --- /dev/null +++ b/Xbim.Common/Step21/Parser/Readme.md @@ -0,0 +1,18 @@ +## The xbim Step21 Parser + +**Remember to run makeparser.bat to generate an updated Scanner/Parser from the lex and yacc (*.y) source** + +GPLEX and GPPG (Gardens Point Parser Generator) is now maintained at https://github.com/ernstc/gplex + +For the original manual on GPLEX see https://github.com/ernstc/gplex/blob/main/GPLEX/gplex.pdf + +We use a relatively old version (1.2.2) of GPLEX but have tweaked the output to support parsing files > 2GB by changing `int` indexes to `long`s +in the generated code. Since we've not backported this to the origin but need to support regneration of the Parser code, this is the strategy: + +The _gplex.frame_ file contains the extracted template code normally embedded in gplex.exe incorporating the int -> long fixes. +This ends up generating Step21Lex.cs with the 'long' amendments upon any regeneration since we pass in `/frame:gplex.frame` in the args in makeparser.bak. + +_GplexBuffers.cs_ is the 'static' GPLEX dependencies of the Scanner in Step21Lex.cs - which have also had the int->long fix applied manually. +This file is now generated as a distinct file by gplex.exe (because we specify '/noEmbedBuffers' args to gplex so the classes are not mergeded into +the re-generated Step21Lex.cs file). +In order to retain our changes it's important this buffers file is not committed. As such we roll back the edits to 'GplexBuffers.cs' in the batch script. \ No newline at end of file diff --git a/Xbim.Common/Step21/Parser/Readme.txt b/Xbim.Common/Step21/Parser/Readme.txt deleted file mode 100644 index ebad4d1cb..000000000 --- a/Xbim.Common/Step21/Parser/Readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -Remember to run makeparser.bat to create the lex and yacc source - -Note the variable "top" produced by GPPG is name clash undedr the new c# compiler and has been renamed to topIdx -in the parser, so you need to run a find and replace on .top to .topIdx in the StepP21Parser.cs produced by GPPG \ No newline at end of file diff --git a/Xbim.Common/Step21/Parser/StepP21Lex.cs b/Xbim.Common/Step21/Parser/StepP21Lex.cs index 1dc6ee862..babd057d1 100644 --- a/Xbim.Common/Step21/Parser/StepP21Lex.cs +++ b/Xbim.Common/Step21/Parser/StepP21Lex.cs @@ -5,20 +5,21 @@ // See accompanying file GPLEXcopyright.rtf. // // GPLEX Version: 1.2.2 -// Machine: MAC3 -// DateTime: 24/03/2022 23:03:40 -// UserName: Claudio -// GPLEX input file -// GPLEX frame file +// Machine: ANDY-XBIM +// DateTime: 25/03/2025 15:48:09 +// UserName: AndyWard +// GPLEX input file +// GPLEX frame file // // Option settings: verbose, parser, minimize -// Option settings: noCompressNext, noPersistBuffer, embedbuffers +// Option settings: noCompressNext, noPersistBuffer, noEmbedBuffers // -// // Revised backup code // Version 1.2.1 of 24-June-2013 // + +// Customised in xbim to support input files > int32 length // #define BACKUP #define BYTEMODE @@ -31,6 +32,7 @@ using System.Runtime.Serialization; using System.Diagnostics.CodeAnalysis; +using QUT.GplexBuffers; using QUT.Gppg; namespace Xbim.IO.Parser @@ -124,8 +126,8 @@ private static int GetMaxParseToken() { enum Result {accept, noMatch, contextFound}; - const int maxAccept = 82; - const int initial = 83; + const int maxAccept = 89; + const int initial = 90; const int eofNum = 0; const int goStart = -1; const int INITIAL = 0; @@ -161,9 +163,9 @@ public void SetValue() #endif // STACK #region ScannerTables - static int[] startState = new int[] {83, 128, 0}; + static int[] startState = new int[] {90, 191, 0}; - static short[][] nextState = new short[130][] { + static short[][] nextState = new short[193][] { /* nextState[ 0] */ new short[] { // Shortest string "" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -216,18 +218,49 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* nextState[ 3] */ null, // Shortest string "\t" -/* nextState[ 4] */ null, // Shortest string "\n" -/* nextState[ 5] */ null, // Shortest string "\r" -/* nextState[ 6] */ null, // Shortest string "\x20" -/* nextState[ 7] */ new short[] { // Shortest string "!" +/* nextState[ 4] */ new short[] { // Shortest string "\n" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 5] */ new short[] { // Shortest string "\r" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 6] */ new short[] { // Shortest string "!" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, -1, -1, -1, -1, -1, -1, - -1, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, -1, -1, -1, -1, 81, - -1, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, -1, -1, -1, -1, -1, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, -1, -1, -1, -1, -1, -1, + -1, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, -1, -1, -1, -1, 87, + -1, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -236,14 +269,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 8] */ new short[] { // Shortest string "\"" +/* nextState[ 7] */ new short[] { // Shortest string "\"" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, -1, -1, -1, -1, -1, -1, - -1, 127, 127, 127, 127, 127, 127, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, -1, -1, -1, -1, -1, -1, + -1, 190, 190, 190, 190, 190, 190, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 127, 127, 127, 127, 127, 127, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 190, 190, 190, 190, 190, 190, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -253,11 +286,11 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 9] */ new short[] { // Shortest string "#" +/* nextState[ 8] */ new short[] { // Shortest string "#" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, -1, -1, -1, -1, -1, -1, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -270,14 +303,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 10] */ null, // Shortest string "$" -/* nextState[ 11] */ new short[] { // Shortest string "&" +/* nextState[ 9] */ null, // Shortest string "$" +/* nextState[ 10] */ new short[] { // Shortest string "&" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 122, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 184, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -288,31 +321,31 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 12] */ new short[] { // Shortest string "'" - -1, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 75, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97}, -/* nextState[ 13] */ null, // Shortest string "(" -/* nextState[ 14] */ null, // Shortest string ")" -/* nextState[ 15] */ null, // Shortest string "*" -/* nextState[ 16] */ new short[] { // Shortest string "+" +/* nextState[ 11] */ new short[] { // Shortest string "'" + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 106, 106, 107, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 73, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 108, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106}, +/* nextState[ 12] */ null, // Shortest string "(" +/* nextState[ 13] */ null, // Shortest string ")" +/* nextState[ 14] */ null, // Shortest string "*" +/* nextState[ 15] */ new short[] { // Shortest string "+" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 104, -1, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -325,16 +358,16 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 17] */ null, // Shortest string "," -/* nextState[ 18] */ new short[] { // Shortest string "." +/* nextState[ 16] */ null, // Shortest string "," +/* nextState[ 17] */ new short[] { // Shortest string "." -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, -1, -1, -1, -1, -1, -1, - -1, 93, 93, 93, 93, 93, 94, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 94, 95, 93, 93, 93, 93, 93, -1, -1, -1, -1, 93, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, + 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, -1, -1, -1, -1, -1, -1, + -1, 100, 100, 100, 100, 100, 101, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 101, 102, 100, 100, 100, 100, 100, -1, -1, -1, -1, 100, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -343,10 +376,10 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 19] */ new short[] { // Shortest string "/" +/* nextState[ 18] */ new short[] { // Shortest string "/" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -360,15 +393,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 20] */ new short[] { // Shortest string "0" +/* nextState[ 19] */ new short[] { // Shortest string "0" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 62, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 62, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -377,17 +410,17 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 21] */ null, // Shortest string ";" -/* nextState[ 22] */ null, // Shortest string "=" -/* nextState[ 23] */ new short[] { // Shortest string "A" +/* nextState[ 20] */ null, // Shortest string ";" +/* nextState[ 21] */ null, // Shortest string "=" +/* nextState[ 22] */ new short[] { // Shortest string "A" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -396,15 +429,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 24] */ new short[] { // Shortest string "D" +/* nextState[ 23] */ new short[] { // Shortest string "D" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 58, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 57, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -413,15 +446,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 25] */ new short[] { // Shortest string "E" +/* nextState[ 24] */ new short[] { // Shortest string "E" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 42, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 41, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -430,15 +463,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 26] */ new short[] { // Shortest string "H" +/* nextState[ 25] */ new short[] { // Shortest string "H" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 36, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 35, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -447,15 +480,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 27] */ new short[] { // Shortest string "I" +/* nextState[ 26] */ new short[] { // Shortest string "I" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 33, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 32, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -464,15 +497,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 28] */ new short[] { // Shortest string "S" +/* nextState[ 27] */ new short[] { // Shortest string "S" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 29, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 28, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -481,15 +514,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 29] */ new short[] { // Shortest string "ST" +/* nextState[ 28] */ new short[] { // Shortest string "ST" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 30, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 29, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -498,15 +531,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 30] */ new short[] { // Shortest string "STE" +/* nextState[ 29] */ new short[] { // Shortest string "STE" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 31, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 30, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -515,15 +548,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 31] */ new short[] { // Shortest string "STEP" +/* nextState[ 30] */ new short[] { // Shortest string "STEP" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, 32, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, 31, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -532,16 +565,16 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 32] */ null, // Shortest string "STEP;" -/* nextState[ 33] */ new short[] { // Shortest string "IS" +/* nextState[ 31] */ null, // Shortest string "STEP;" +/* nextState[ 32] */ new short[] { // Shortest string "IS" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 34, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 33, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -550,15 +583,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 34] */ new short[] { // Shortest string "ISO" +/* nextState[ 33] */ new short[] { // Shortest string "ISO" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, -1, 35, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, -1, 34, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -567,16 +600,16 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 35] */ null, // Shortest string "ISO;" -/* nextState[ 36] */ new short[] { // Shortest string "HE" +/* nextState[ 34] */ null, // Shortest string "ISO;" +/* nextState[ 35] */ new short[] { // Shortest string "HE" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 37, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 36, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -585,15 +618,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 37] */ new short[] { // Shortest string "HEA" +/* nextState[ 36] */ new short[] { // Shortest string "HEA" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 38, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 37, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -602,15 +635,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 38] */ new short[] { // Shortest string "HEAD" +/* nextState[ 37] */ new short[] { // Shortest string "HEAD" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 39, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 38, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -619,15 +652,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 39] */ new short[] { // Shortest string "HEADE" +/* nextState[ 38] */ new short[] { // Shortest string "HEADE" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 40, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 39, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -636,15 +669,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 40] */ new short[] { // Shortest string "HEADER" +/* nextState[ 39] */ new short[] { // Shortest string "HEADER" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, 41, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, 40, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -653,16 +686,16 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 41] */ null, // Shortest string "HEADER;" -/* nextState[ 42] */ new short[] { // Shortest string "EN" +/* nextState[ 40] */ null, // Shortest string "HEADER;" +/* nextState[ 41] */ new short[] { // Shortest string "EN" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 43, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 42, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -671,15 +704,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 43] */ new short[] { // Shortest string "END" +/* nextState[ 42] */ new short[] { // Shortest string "END" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 44, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 43, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -688,15 +721,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 44] */ new short[] { // Shortest string "ENDS" +/* nextState[ 43] */ new short[] { // Shortest string "ENDS" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 45, 23, 46, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 47, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 44, 22, 45, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 46, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -705,15 +738,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 45] */ new short[] { // Shortest string "ENDSC" +/* nextState[ 44] */ new short[] { // Shortest string "ENDSC" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 54, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 53, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -722,15 +755,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 46] */ new short[] { // Shortest string "ENDSE" +/* nextState[ 45] */ new short[] { // Shortest string "ENDSE" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 52, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 51, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -739,15 +772,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 47] */ new short[] { // Shortest string "ENDST" +/* nextState[ 46] */ new short[] { // Shortest string "ENDST" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 48, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 47, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -756,15 +789,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 48] */ new short[] { // Shortest string "ENDSTE" +/* nextState[ 47] */ new short[] { // Shortest string "ENDSTE" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 49, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 48, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -773,15 +806,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 49] */ new short[] { // Shortest string "ENDSTEP" +/* nextState[ 48] */ new short[] { // Shortest string "ENDSTEP" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, 50, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, 49, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -790,33 +823,33 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 50] */ new short[] { // Shortest string "ENDSTEP;" - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, -1, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, -/* nextState[ 51] */ null, // Shortest string "ENDSTEP;\x01" -/* nextState[ 52] */ new short[] { // Shortest string "ENDSEC" +/* nextState[ 49] */ new short[] { // Shortest string "ENDSTEP;" + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, -1, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, +/* nextState[ 50] */ null, // Shortest string "ENDSTEP;\x01" +/* nextState[ 51] */ new short[] { // Shortest string "ENDSEC" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, 53, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, 52, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -825,16 +858,16 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 53] */ null, // Shortest string "ENDSEC;" -/* nextState[ 54] */ new short[] { // Shortest string "ENDSCO" +/* nextState[ 52] */ null, // Shortest string "ENDSEC;" +/* nextState[ 53] */ new short[] { // Shortest string "ENDSCO" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 55, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 54, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -843,15 +876,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 55] */ new short[] { // Shortest string "ENDSCOP" +/* nextState[ 54] */ new short[] { // Shortest string "ENDSCOP" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 56, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 55, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -860,17 +893,17 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 56] */ null, // Shortest string "ENDSCOPE" -/* nextState[ 57] */ null, // Shortest string "END-ISO;" -/* nextState[ 58] */ new short[] { // Shortest string "DA" +/* nextState[ 55] */ null, // Shortest string "ENDSCOPE" +/* nextState[ 56] */ null, // Shortest string "END-ISO;" +/* nextState[ 57] */ new short[] { // Shortest string "DA" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 59, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 58, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -879,15 +912,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 59] */ new short[] { // Shortest string "DAT" +/* nextState[ 58] */ new short[] { // Shortest string "DAT" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, - -1, 60, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, + -1, 59, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -896,15 +929,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 60] */ new short[] { // Shortest string "DATA" +/* nextState[ 59] */ new short[] { // Shortest string "DATA" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, 61, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, 60, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -913,33 +946,50 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 61] */ null, // Shortest string "DATA;" -/* nextState[ 62] */ new short[] { // Shortest string "+." +/* nextState[ 60] */ null, // Shortest string "DATA;" +/* nextState[ 61] */ new short[] { // Shortest string "0." + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 89, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 62] */ new short[] { // Shortest string "0E" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 97, -1, 97, -1, -1, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, -1, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 63] */ new short[] { // Shortest string "00" +/* nextState[ 63] */ new short[] { // Shortest string "0E0" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 89, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 64, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 64, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, 22, + -1, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -948,15 +998,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 64] */ new short[] { // Shortest string "00E" +/* nextState[ 64] */ new short[] { // Shortest string "+0E0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, -1, 65, -1, -1, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -965,16 +1015,38 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 65] */ new short[] { // Shortest string "+.E+" +/* nextState[ 65] */ null, // Shortest string "0#IND" +/* nextState[ 66] */ null, // Shortest string "/*" +/* nextState[ 67] */ new short[] { // Shortest string ".0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 100, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, -1, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, -1, -1, -1, -1, -1, -1, + -1, 100, 100, 100, 100, 103, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, 100, + -1, 100, 100, 100, 100, 103, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 68] */ null, // Shortest string ".U." +/* nextState[ 69] */ null, // Shortest string ".\x20." +/* nextState[ 70] */ null, // Shortest string ".F." +/* nextState[ 71] */ new short[] { // Shortest string ".0E0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 100, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, -1, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, -1, -1, -1, -1, -1, -1, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, 100, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -982,15 +1054,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 66] */ new short[] { // Shortest string "00E0" +/* nextState[ 72] */ new short[] { // Shortest string "+0" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, -1, -1, -1, -1, -1, -1, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, 23, - -1, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -999,17 +1071,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 67] */ null, // Shortest string "+.#IND" -/* nextState[ 68] */ null, // Shortest string "/*" -/* nextState[ 69] */ new short[] { // Shortest string ".0" +/* nextState[ 73] */ new short[] { // Shortest string "''" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, 89, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, -1, -1, -1, -1, -1, -1, - -1, 93, 93, 93, 93, 96, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, 93, - -1, 93, 93, 93, 93, 96, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1018,18 +1088,32 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 70] */ null, // Shortest string ".U." -/* nextState[ 71] */ null, // Shortest string ".\x20." -/* nextState[ 72] */ null, // Shortest string ".F." -/* nextState[ 73] */ new short[] { // Shortest string ".0E0" +/* nextState[ 74] */ new short[] { // Shortest string "'\\'" + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 107, 109, 109, 107, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 78, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 116, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109}, +/* nextState[ 75] */ new short[] { // Shortest string "'\\P'" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, -1, -1, -1, -1, -1, -1, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, 93, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1038,14 +1122,65 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 74] */ new short[] { // Shortest string "+0" +/* nextState[ 76] */ new short[] { // Shortest string "" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 76, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 77] */ new short[] { // Shortest string "'\\S\\''" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 80, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 78] */ new short[] { // Shortest string "'\\''" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 74, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 79] */ new short[] { // Shortest string "'\\\n'" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 89, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1055,10 +1190,27 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 75] */ new short[] { // Shortest string "''" +/* nextState[ 80] */ new short[] { // Shortest string "'\\S\\'" + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 106, 106, 107, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 77, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 108, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106}, +/* nextState[ 81] */ new short[] { // Shortest string "'\n'" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 97, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1072,12 +1224,12 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 76] */ null, // Shortest string "&SCOPE" -/* nextState[ 77] */ new short[] { // Shortest string "#0" - -1, -1, -1, -1, -1, -1, -1, -1, -1, 126, -1, -1, -1, -1, -1, -1, +/* nextState[ 82] */ null, // Shortest string "&SCOPE" +/* nextState[ 83] */ new short[] { // Shortest string "#0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, -1, -1, -1, 78, -1, -1, + 188, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 189, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, -1, -1, -1, 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1090,20 +1242,21 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 78] */ null, // Shortest string "#0=" -/* nextState[ 79] */ null, // Shortest string "#0\t=" -/* nextState[ 80] */ null, // Shortest string "\"0\"" -/* nextState[ 81] */ null, // Shortest string "!0" -/* nextState[ 82] */ null, // Shortest string "*/" -/* nextState[ 83] */ new short[] { // Shortest string "" +/* nextState[ 84] */ null, // Shortest string "#0=" +/* nextState[ 85] */ null, // Shortest string "#0/=" +/* nextState[ 86] */ null, // Shortest string "\"0\"" +/* nextState[ 87] */ null, // Shortest string "!0" +/* nextState[ 88] */ null, // Shortest string "\n\r" +/* nextState[ 89] */ null, // Shortest string "*/" +/* nextState[ 90] */ new short[] { // Shortest string "" 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 7, 8, 9, 10, 2, 11, 12, 13, 14, 15, 16, 17, 16, 18, 19, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 21, 2, 22, 2, 2, - 2, 23, 23, 23, 24, 25, 23, 23, 26, 27, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 28, 23, 23, 23, 23, 23, 23, 23, 2, 2, 2, 2, 23, - 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 2, 2, 2, + 3, 6, 7, 8, 9, 2, 10, 11, 12, 13, 14, 15, 16, 15, 17, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 2, 20, 2, 21, 2, 2, + 2, 22, 22, 22, 23, 24, 22, 22, 25, 26, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 27, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, + 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -1112,11 +1265,11 @@ public void SetValue() 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, -/* nextState[ 84] */ new short[] { // Shortest string "ISO-" +/* nextState[ 91] */ new short[] { // Shortest string "ISO-" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, -1, 35, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1129,12 +1282,12 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 85] */ new short[] { // Shortest string "END-" +/* nextState[ 92] */ new short[] { // Shortest string "END-" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1146,13 +1299,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 86] */ new short[] { // Shortest string "END-I" +/* nextState[ 93] */ new short[] { // Shortest string "END-I" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1163,12 +1316,12 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 87] */ new short[] { // Shortest string "END-IS" +/* nextState[ 94] */ new short[] { // Shortest string "END-IS" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1180,11 +1333,11 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 88] */ new short[] { // Shortest string "END-ISO" +/* nextState[ 95] */ new short[] { // Shortest string "END-ISO" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, -1, 57, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 95, -1, -1, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1197,12 +1350,12 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 89] */ new short[] { // Shortest string "+.#" +/* nextState[ 96] */ new short[] { // Shortest string "0#" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 98, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1214,11 +1367,11 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 90] */ new short[] { // Shortest string "+.E" +/* nextState[ 97] */ new short[] { // Shortest string "0E+" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, -1, 65, -1, -1, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1231,12 +1384,12 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 91] */ new short[] { // Shortest string "+.#I" +/* nextState[ 98] */ new short[] { // Shortest string "0#I" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 92, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1248,12 +1401,12 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 92] */ new short[] { // Shortest string "+.#IN" +/* nextState[ 99] */ new short[] { // Shortest string "0#IN" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 67, -1, 67, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 65, -1, 65, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1265,15 +1418,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 93] */ new short[] { // Shortest string ".\x20" +/* nextState[ 100] */ new short[] { // Shortest string ".\x20" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, -1, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, 93, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, + 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, -1, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, 100, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1282,15 +1435,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 94] */ new short[] { // Shortest string ".F" +/* nextState[ 101] */ new short[] { // Shortest string ".F" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, -1, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, -1, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, 93, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, + 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, 100, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1299,15 +1452,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 95] */ new short[] { // Shortest string ".U" +/* nextState[ 102] */ new short[] { // Shortest string ".U" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, -1, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, -1, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, 93, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, + 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, 100, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1316,15 +1469,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 96] */ new short[] { // Shortest string ".0E" +/* nextState[ 103] */ new short[] { // Shortest string ".0E" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, -1, 65, 71, -1, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, -1, -1, -1, -1, -1, -1, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, 93, - -1, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, -1, -1, -1, -1, -1, + 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 97, -1, 97, 69, -1, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, -1, -1, -1, -1, -1, -1, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, 100, + -1, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1333,14 +1486,30 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 97] */ null, // Shortest string "'\x01" -/* nextState[ 98] */ new short[] { // Shortest string "'\\" +/* nextState[ 104] */ new short[] { // Shortest string "+." + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 99, -1, -1, 100, -1, -1, -1, -1, 101, -1, -1, -1, 97, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 105] */ new short[] { // Shortest string "+0E" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 97, -1, 97, -1, -1, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1351,13 +1520,168 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 99] */ new short[] { // Shortest string "'\\P" +/* nextState[ 106] */ null, // Shortest string "'\x01" +/* nextState[ 107] */ new short[] { // Shortest string "'\n" + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 81, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 160, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107}, +/* nextState[ 108] */ new short[] { // Shortest string "'\\" + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 109, 106, 106, 109, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 74, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 110, 106, 106, 111, 106, 106, 106, 106, 140, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106}, +/* nextState[ 109] */ new short[] { // Shortest string "'\\\n" + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 107, 109, 109, 107, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 79, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 116, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109}, +/* nextState[ 110] */ new short[] { // Shortest string "'\\P" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 159, 159, 159, 159, 159, 159, 159, 159, 159, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 111] */ new short[] { // Shortest string "'\\S" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 115, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 112] */ new short[] { // Shortest string "'\\P\x01" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 113] */ null, // Shortest string "" +/* nextState[ 114] */ new short[] { // Shortest string "" + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 109, 106, 106, 109, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 80, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 110, 106, 106, 111, 106, 106, 106, 106, 140, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106}, +/* nextState[ 115] */ new short[] { // Shortest string "'\\S\\" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 106, 106, 106, 106, 106, 106, 106, 80, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 116] */ new short[] { // Shortest string "'\\\n\\" + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 117, 109, 109, 118, 109, 109, 109, 109, 119, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109}, +/* nextState[ 117] */ new short[] { // Shortest string "'\\\n\\P" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 128, 128, 128, 128, 128, 128, 128, 128, 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1368,13 +1692,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 100] */ new short[] { // Shortest string "'\\S" +/* nextState[ 118] */ new short[] { // Shortest string "'\\\n\\S" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 121, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 139, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1385,13 +1709,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 101] */ new short[] { // Shortest string "'\\X" +/* nextState[ 119] */ new short[] { // Shortest string "'\\\n\\X" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 102, -1, 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 120, -1, 121, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 104, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 122, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1402,13 +1726,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 102] */ new short[] { // Shortest string "'\\X2" +/* nextState[ 120] */ new short[] { // Shortest string "'\\\n\\X2" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1419,13 +1743,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 103] */ new short[] { // Shortest string "'\\X4" +/* nextState[ 121] */ new short[] { // Shortest string "'\\\n\\X4" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 106, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1436,14 +1760,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 104] */ new short[] { // Shortest string "'\\X\\" +/* nextState[ 122] */ new short[] { // Shortest string "'\\\n\\X\\" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, -1, -1, -1, -1, -1, -1, - -1, 105, 105, 105, 105, 105, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, -1, -1, -1, -1, -1, -1, + -1, 123, 123, 123, 123, 123, 123, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 105, 105, 105, 105, 105, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 123, 123, 123, 123, 123, 123, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1453,14 +1777,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 105] */ new short[] { // Shortest string "'\\X\\0" +/* nextState[ 123] */ new short[] { // Shortest string "'\\\n\\X\\0" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, -1, -1, -1, -1, -1, -1, - -1, 97, 97, 97, 97, 97, 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, -1, -1, -1, -1, -1, -1, + -1, 109, 109, 109, 109, 109, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 97, 97, 97, 97, 97, 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 109, 109, 109, 109, 109, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1470,14 +1794,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 106] */ new short[] { // Shortest string "'\\X4\\" +/* nextState[ 124] */ new short[] { // Shortest string "'\\\n\\X4\\" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, -1, -1, -1, -1, -1, -1, - -1, 107, 107, 107, 107, 107, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 108, -1, -1, -1, - -1, 107, 107, 107, 107, 107, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, -1, -1, -1, -1, -1, -1, + -1, 125, 125, 125, 125, 125, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 126, -1, -1, -1, + -1, 125, 125, 125, 125, 125, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1487,14 +1811,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 107] */ new short[] { // Shortest string "'\\X4\\0" +/* nextState[ 125] */ new short[] { // Shortest string "'\\\n\\X4\\0" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, -1, -1, -1, -1, -1, -1, - -1, 111, 111, 111, 111, 111, 111, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, -1, -1, -1, -1, -1, -1, + -1, 129, 129, 129, 129, 129, 129, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 111, 111, 111, 111, 111, 111, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 129, 129, 129, 129, 129, 129, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1504,13 +1828,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 108] */ new short[] { // Shortest string "'\\X2\\\\" +/* nextState[ 126] */ new short[] { // Shortest string "'\\\n\\X2\\\\" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 127, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1521,11 +1845,11 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 109] */ new short[] { // Shortest string "'\\X2\\\\X" +/* nextState[ 127] */ new short[] { // Shortest string "'\\\n\\X2\\\\X" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1538,13 +1862,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 110] */ new short[] { // Shortest string "'\\PA" +/* nextState[ 128] */ new short[] { // Shortest string "'\\\n\\PA" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 97, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1555,14 +1879,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 111] */ new short[] { // Shortest string "'\\X4\\00" +/* nextState[ 129] */ new short[] { // Shortest string "'\\\n\\X4\\00" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, -1, -1, -1, -1, -1, - -1, 112, 112, 112, 112, 112, 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, -1, -1, -1, -1, -1, -1, + -1, 130, 130, 130, 130, 130, 130, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 112, 112, 112, 112, 112, 112, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 130, 130, 130, 130, 130, 130, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1572,14 +1896,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 112] */ new short[] { // Shortest string "'\\X4\\000" +/* nextState[ 130] */ new short[] { // Shortest string "'\\\n\\X4\\000" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, -1, -1, -1, -1, -1, -1, - -1, 113, 113, 113, 113, 113, 113, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, -1, -1, -1, -1, -1, -1, + -1, 131, 131, 131, 131, 131, 131, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 113, 113, 113, 113, 113, 113, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 131, 131, 131, 131, 131, 131, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1589,14 +1913,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 113] */ new short[] { // Shortest string "'\\X4\\0000" +/* nextState[ 131] */ new short[] { // Shortest string "'\\\n\\X4\\0000" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, -1, -1, -1, -1, -1, -1, - -1, 114, 114, 114, 114, 114, 114, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, -1, -1, -1, -1, -1, -1, + -1, 132, 132, 132, 132, 132, 132, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 114, 114, 114, 114, 114, 114, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 132, 132, 132, 132, 132, 132, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1606,14 +1930,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 114] */ new short[] { // Shortest string "'\\X4\\00000" +/* nextState[ 132] */ new short[] { // Shortest string "'\\\n\\X4\\00000" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, -1, -1, -1, -1, -1, -1, - -1, 115, 115, 115, 115, 115, 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, -1, -1, -1, -1, -1, -1, + -1, 133, 133, 133, 133, 133, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 115, 115, 115, 115, 115, 115, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 133, 133, 133, 133, 133, 133, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1623,14 +1947,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 115] */ new short[] { // Shortest string "'\\X4\\000000" +/* nextState[ 133] */ new short[] { // Shortest string "'\\\n\\X4\\000000" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, -1, -1, -1, -1, -1, -1, - -1, 116, 116, 116, 116, 116, 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, -1, -1, -1, -1, -1, -1, + -1, 134, 134, 134, 134, 134, 134, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 116, 116, 116, 116, 116, 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 134, 134, 134, 134, 134, 134, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1640,14 +1964,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 116] */ new short[] { // Shortest string "'\\X4\\0000000" +/* nextState[ 134] */ new short[] { // Shortest string "'\\\n\\X4\\0000000" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, -1, -1, -1, -1, -1, -1, - -1, 106, 106, 106, 106, 106, 106, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, -1, -1, -1, -1, -1, -1, + -1, 124, 124, 124, 124, 124, 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 106, 106, 106, 106, 106, 106, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 124, 124, 124, 124, 124, 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1657,14 +1981,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 117] */ new short[] { // Shortest string "'\\X2\\" +/* nextState[ 135] */ new short[] { // Shortest string "'\\\n\\X2\\" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, -1, -1, -1, -1, -1, -1, - -1, 118, 118, 118, 118, 118, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 108, -1, -1, -1, - -1, 118, 118, 118, 118, 118, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, -1, -1, -1, -1, -1, -1, + -1, 136, 136, 136, 136, 136, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 126, -1, -1, -1, + -1, 136, 136, 136, 136, 136, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1674,14 +1998,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 118] */ new short[] { // Shortest string "'\\X2\\0" +/* nextState[ 136] */ new short[] { // Shortest string "'\\\n\\X2\\0" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, -1, -1, -1, -1, -1, -1, - -1, 119, 119, 119, 119, 119, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, -1, -1, -1, -1, -1, -1, + -1, 137, 137, 137, 137, 137, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 119, 119, 119, 119, 119, 119, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 137, 137, 137, 137, 137, 137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1691,14 +2015,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 119] */ new short[] { // Shortest string "'\\X2\\00" +/* nextState[ 137] */ new short[] { // Shortest string "'\\\n\\X2\\00" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, -1, -1, -1, -1, -1, -1, - -1, 120, 120, 120, 120, 120, 120, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, -1, -1, -1, -1, -1, -1, + -1, 138, 138, 138, 138, 138, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 120, 120, 120, 120, 120, 120, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 138, 138, 138, 138, 138, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1708,14 +2032,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 120] */ new short[] { // Shortest string "'\\X2\\000" +/* nextState[ 138] */ new short[] { // Shortest string "'\\\n\\X2\\000" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, -1, -1, -1, -1, -1, -1, - -1, 117, 117, 117, 117, 117, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, -1, -1, -1, -1, -1, -1, + -1, 135, 135, 135, 135, 135, 135, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 117, 117, 117, 117, 117, 117, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, 135, 135, 135, 135, 135, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1725,15 +2049,15 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 121] */ new short[] { // Shortest string "'\\S\\" +/* nextState[ 139] */ new short[] { // Shortest string "'\\\n\\S\\" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, -1, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1742,12 +2066,369 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 122] */ new short[] { // Shortest string "&S" +/* nextState[ 140] */ new short[] { // Shortest string "'\\X" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 141, 112, 155, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 142, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 141] */ new short[] { // Shortest string "'\\X2" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 151, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 142] */ new short[] { // Shortest string "'\\X\\" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 112, 112, 112, 112, 112, 112, + 112, 143, 143, 143, 143, 143, 143, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 143, 143, 143, 143, 143, 143, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 143] */ new short[] { // Shortest string "'\\X\\0" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 112, 112, 112, 112, 112, 112, + 112, 106, 106, 106, 106, 106, 106, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 106, 106, 106, 106, 106, 106, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 144] */ new short[] { // Shortest string "'\\X4\\0" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 112, 112, 112, 112, 112, 112, + 112, 145, 145, 145, 145, 145, 145, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 145, 145, 145, 145, 145, 145, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 145] */ new short[] { // Shortest string "'\\X4\\00" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 112, 112, 112, 112, 112, 112, + 112, 146, 146, 146, 146, 146, 146, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 146, 146, 146, 146, 146, 146, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 146] */ new short[] { // Shortest string "'\\X4\\000" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 112, 112, 112, 112, 112, 112, + 112, 147, 147, 147, 147, 147, 147, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 147, 147, 147, 147, 147, 147, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 147] */ new short[] { // Shortest string "'\\X4\\0000" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 112, 112, 112, 112, 112, 112, + 112, 148, 148, 148, 148, 148, 148, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 148, 148, 148, 148, 148, 148, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 148] */ new short[] { // Shortest string "'\\X4\\00000" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 112, 112, 112, 112, 112, 112, + 112, 149, 149, 149, 149, 149, 149, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 149, 149, 149, 149, 149, 149, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 149] */ new short[] { // Shortest string "'\\X4\\000000" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 112, 112, 112, 112, 112, 112, + 112, 150, 150, 150, 150, 150, 150, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 150, 150, 150, 150, 150, 150, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 150] */ new short[] { // Shortest string "'\\X4\\0000000" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 112, 112, 112, 112, 112, 112, + 112, 156, 156, 156, 156, 156, 156, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 156, 156, 156, 156, 156, 156, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 151] */ new short[] { // Shortest string "'\\X2\\" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 112, 112, 112, 112, 112, 112, + 112, 152, 152, 152, 152, 152, 152, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 157, 112, 112, 112, + 112, 152, 152, 152, 152, 152, 152, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 152] */ new short[] { // Shortest string "'\\X2\\0" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 112, 112, 112, 112, 112, 112, + 112, 153, 153, 153, 153, 153, 153, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 153, 153, 153, 153, 153, 153, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 153] */ new short[] { // Shortest string "'\\X2\\00" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 112, 112, 112, 112, 112, 112, + 112, 154, 154, 154, 154, 154, 154, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 154, 154, 154, 154, 154, 154, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 154] */ new short[] { // Shortest string "'\\X2\\000" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 112, 112, 112, 112, 112, 112, + 112, 151, 151, 151, 151, 151, 151, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 151, 151, 151, 151, 151, 151, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 155] */ new short[] { // Shortest string "'\\X4" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 156, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 156] */ new short[] { // Shortest string "'\\X4\\" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 112, 112, 112, 112, 112, 112, + 112, 144, 144, 144, 144, 144, 144, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 157, 112, 112, 112, + 112, 144, 144, 144, 144, 144, 144, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 157] */ new short[] { // Shortest string "'\\X2\\\\" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 158, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 158] */ new short[] { // Shortest string "'\\X2\\\\X" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 159, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 159] */ new short[] { // Shortest string "'\\PA" + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, -1, 112, 112, -1, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 75, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 106, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112}, +/* nextState[ 160] */ new short[] { // Shortest string "'\n\\" + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 161, 107, 107, 162, 107, 107, 107, 107, 163, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107}, +/* nextState[ 161] */ new short[] { // Shortest string "'\n\\P" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 123, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 172, 172, 172, 172, 172, 172, 172, 172, 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1759,30 +2440,47 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 123] */ new short[] { // Shortest string "&SC" +/* nextState[ 162] */ new short[] { // Shortest string "'\n\\S" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 183, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 124, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 163] */ new short[] { // Shortest string "'\n\\X" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 164, -1, 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 124] */ new short[] { // Shortest string "&SCO" +/* nextState[ 164] */ new short[] { // Shortest string "'\n\\X2" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 179, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1793,13 +2491,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 125] */ new short[] { // Shortest string "&SCOP" +/* nextState[ 165] */ new short[] { // Shortest string "'\n\\X4" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 168, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1810,14 +2508,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 126] */ new short[] { // Shortest string "#0\t" - -1, -1, -1, -1, -1, -1, -1, -1, -1, 126, -1, -1, -1, -1, -1, -1, +/* nextState[ 166] */ new short[] { // Shortest string "'\n\\X\\" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, -1, -1, -1, -1, -1, -1, + -1, 167, 167, 167, 167, 167, 167, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 167, 167, 167, 167, 167, 167, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1827,14 +2525,14 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 127] */ new short[] { // Shortest string "\"0" +/* nextState[ 167] */ new short[] { // Shortest string "'\n\\X\\0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, -1, -1, -1, -1, -1, -1, - -1, 127, 127, 127, 127, 127, 127, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, -1, -1, -1, -1, -1, -1, + -1, 107, 107, 107, 107, 107, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 127, 127, 127, 127, 127, 127, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 107, 107, 107, 107, 107, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1844,16 +2542,33 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 128] */ new short[] { // Shortest string "" +/* nextState[ 168] */ new short[] { // Shortest string "'\n\\X4\\" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, -1, -1, -1, -1, -1, -1, + -1, 169, 169, 169, 169, 169, 169, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, + -1, 169, 169, 169, 169, 169, 169, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 129, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 169] */ new short[] { // Shortest string "'\n\\X4\\0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, -1, -1, -1, -1, -1, -1, + -1, 173, 173, 173, 173, 173, 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 173, 173, 173, 173, 173, 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1861,13 +2576,13 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -/* nextState[ 129] */ new short[] { // Shortest string "*" +/* nextState[ 170] */ new short[] { // Shortest string "'\n\\X2\\\\" -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -1878,170 +2593,541 @@ public void SetValue() -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, -}; - - static Scanner() { - nextState[3] = nextState[2]; - nextState[4] = nextState[2]; - nextState[5] = nextState[2]; - nextState[6] = nextState[2]; - nextState[10] = nextState[2]; - nextState[13] = nextState[2]; - nextState[14] = nextState[2]; - nextState[15] = nextState[2]; - nextState[17] = nextState[2]; - nextState[21] = nextState[2]; - nextState[22] = nextState[2]; - nextState[32] = nextState[2]; - nextState[35] = nextState[2]; - nextState[41] = nextState[2]; - nextState[51] = nextState[50]; - nextState[53] = nextState[2]; - nextState[56] = nextState[23]; - nextState[57] = nextState[2]; - nextState[61] = nextState[2]; - nextState[67] = nextState[2]; - nextState[68] = nextState[2]; - nextState[70] = nextState[2]; - nextState[71] = nextState[2]; - nextState[72] = nextState[2]; - nextState[76] = nextState[2]; - nextState[78] = nextState[2]; - nextState[79] = nextState[2]; - nextState[80] = nextState[2]; - nextState[81] = nextState[7]; - nextState[82] = nextState[2]; - nextState[97] = nextState[12]; - } - - -int NextState() { - if (code == ScanBuff.EndOfFile) - return eofNum; - else - return nextState[state][code]; -} - -#endregion - - -#if BACKUP - // ============================================================== - // == Nested struct used for backup in automata that do backup == - // ============================================================== - - struct Context // class used for automaton backup. - { - public long bPos; - public long rPos; // scanner.readPos saved value - public int cCol; - public int lNum; // Need this in case of backup over EOL. - public int state; - public int cChr; - } - - private Context ctx = new Context(); -#endif // BACKUP - - // ============================================================== - // ==== Nested struct to support input switching in scanners ==== - // ============================================================== - - struct BufferContext { - internal ScanBuff buffSv; - internal int chrSv; - internal int cColSv; - internal int lNumSv; - } - - // ============================================================== - // ===== Private methods to save and restore buffer contexts ==== - // ============================================================== - - /// - /// This method creates a buffer context record from - /// the current buffer object, together with some - /// scanner state values. - /// - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - BufferContext MkBuffCtx() - { - BufferContext rslt; - rslt.buffSv = this.buffer; - rslt.chrSv = this.code; - rslt.cColSv = this.cCol; - rslt.lNumSv = this.lNum; - return rslt; - } - - /// - /// This method restores the buffer value and allied - /// scanner state from the given context record value. - /// - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - void RestoreBuffCtx(BufferContext value) - { - this.buffer = value.buffSv; - this.code = value.chrSv; - this.cCol = value.cColSv; - this.lNum = value.lNumSv; - } - // =================== End Nested classes ======================= - -#if !NOFILES - public Scanner(Stream file) - { - SetSource(file); // no unicode option - } -#endif // !NOFILES - - public Scanner() - { } - - private long readPos; - - void GetCode() - { - if (code == '\n') // This needs to be fixed for other conventions - // i.e. [\r\n\205\u2028\u2029] - { - cCol = -1; - lNum++; - } - readPos = buffer.Pos; - - // Now read new codepoint. - code = buffer.Read(); - if (code > ScanBuff.EndOfFile) - { -#if (!BYTEMODE) - if (code >= 0xD800 && code <= 0xDBFF) - { - int next = buffer.Read(); - if (next < 0xDC00 || next > 0xDFFF) - code = ScanBuff.UnicodeReplacementChar; - else - code = (0x10000 + ((code & 0x3FF) << 10) + (next & 0x3FF)); - } -#endif - cCol++; - } - } - - void MarkToken() - { -#if (!PERSIST) - buffer.Mark(); -#endif - tokPos = readPos; - tokLin = lNum; - tokCol = cCol; - } - - void MarkEnd() - { - tokTxt = null; - tokEPos = readPos; +/* nextState[ 171] */ new short[] { // Shortest string "'\n\\X2\\\\X" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 172, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 172] */ new short[] { // Shortest string "'\n\\PA" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 173] */ new short[] { // Shortest string "'\n\\X4\\00" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, -1, -1, -1, -1, -1, -1, + -1, 174, 174, 174, 174, 174, 174, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 174, 174, 174, 174, 174, 174, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 174] */ new short[] { // Shortest string "'\n\\X4\\000" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, -1, -1, -1, -1, -1, -1, + -1, 175, 175, 175, 175, 175, 175, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 175, 175, 175, 175, 175, 175, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 175] */ new short[] { // Shortest string "'\n\\X4\\0000" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, -1, -1, -1, -1, -1, -1, + -1, 176, 176, 176, 176, 176, 176, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 176, 176, 176, 176, 176, 176, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 176] */ new short[] { // Shortest string "'\n\\X4\\00000" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, -1, -1, -1, -1, -1, -1, + -1, 177, 177, 177, 177, 177, 177, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 177, 177, 177, 177, 177, 177, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 177] */ new short[] { // Shortest string "'\n\\X4\\000000" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, -1, -1, -1, -1, -1, -1, + -1, 178, 178, 178, 178, 178, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 178, 178, 178, 178, 178, 178, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 178] */ new short[] { // Shortest string "'\n\\X4\\0000000" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, -1, -1, -1, -1, -1, -1, + -1, 168, 168, 168, 168, 168, 168, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 168, 168, 168, 168, 168, 168, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 179] */ new short[] { // Shortest string "'\n\\X2\\" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, -1, -1, -1, -1, -1, -1, + -1, 180, 180, 180, 180, 180, 180, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 170, -1, -1, -1, + -1, 180, 180, 180, 180, 180, 180, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 180] */ new short[] { // Shortest string "'\n\\X2\\0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, -1, -1, -1, -1, -1, -1, + -1, 181, 181, 181, 181, 181, 181, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 181, 181, 181, 181, 181, 181, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 181] */ new short[] { // Shortest string "'\n\\X2\\00" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, -1, -1, -1, -1, -1, -1, + -1, 182, 182, 182, 182, 182, 182, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 182, 182, 182, 182, 182, 182, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 182] */ new short[] { // Shortest string "'\n\\X2\\000" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, -1, -1, -1, -1, -1, -1, + -1, 179, 179, 179, 179, 179, 179, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 179, 179, 179, 179, 179, 179, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 183] */ new short[] { // Shortest string "'\n\\S\\" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 184] */ new short[] { // Shortest string "&S" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 185, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 185] */ new short[] { // Shortest string "&SC" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 186, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 186] */ new short[] { // Shortest string "&SCO" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 187, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 187] */ new short[] { // Shortest string "&SCOP" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 188] */ new short[] { // Shortest string "#0\t" + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 189] */ new short[] { // Shortest string "#0/" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 190] */ new short[] { // Shortest string "\"0" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, -1, -1, -1, -1, -1, -1, + -1, 190, 190, 190, 190, 190, 190, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 190, 190, 190, 190, 190, 190, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 191] */ new short[] { // Shortest string "" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 192, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +/* nextState[ 192] */ new short[] { // Shortest string "*" + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, +}; + + static Scanner() { + nextState[3] = nextState[2]; + nextState[9] = nextState[2]; + nextState[12] = nextState[2]; + nextState[13] = nextState[2]; + nextState[14] = nextState[2]; + nextState[16] = nextState[2]; + nextState[20] = nextState[2]; + nextState[21] = nextState[2]; + nextState[31] = nextState[2]; + nextState[34] = nextState[2]; + nextState[40] = nextState[2]; + nextState[50] = nextState[49]; + nextState[52] = nextState[2]; + nextState[55] = nextState[22]; + nextState[56] = nextState[2]; + nextState[60] = nextState[2]; + nextState[65] = nextState[2]; + nextState[66] = nextState[2]; + nextState[68] = nextState[2]; + nextState[69] = nextState[2]; + nextState[70] = nextState[2]; + nextState[82] = nextState[2]; + nextState[84] = nextState[2]; + nextState[85] = nextState[2]; + nextState[86] = nextState[2]; + nextState[87] = nextState[6]; + nextState[88] = nextState[2]; + nextState[89] = nextState[2]; + nextState[106] = nextState[11]; + nextState[113] = nextState[76]; + } + + +int NextState() { + if (code == ScanBuff.EndOfFile) + return eofNum; + else + return nextState[state][code]; +} + +#endregion + + +#if BACKUP + // ============================================================== + // == Nested struct used for backup in automata that do backup == + // ============================================================== + + struct Context // class used for automaton backup. + { + public long bPos; + public long rPos; // scanner.readPos saved value + public int cCol; + public int lNum; // Need this in case of backup over EOL. + public int state; + public int cChr; + } + + private Context ctx = new Context(); +#endif // BACKUP + + // ============================================================== + // ==== Nested struct to support input switching in scanners ==== + // ============================================================== + + struct BufferContext { + internal ScanBuff buffSv; + internal int chrSv; + internal int cColSv; + internal int lNumSv; + } + + // ============================================================== + // ===== Private methods to save and restore buffer contexts ==== + // ============================================================== + + /// + /// This method creates a buffer context record from + /// the current buffer object, together with some + /// scanner state values. + /// + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + BufferContext MkBuffCtx() + { + BufferContext rslt; + rslt.buffSv = this.buffer; + rslt.chrSv = this.code; + rslt.cColSv = this.cCol; + rslt.lNumSv = this.lNum; + return rslt; + } + + /// + /// This method restores the buffer value and allied + /// scanner state from the given context record value. + /// + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + void RestoreBuffCtx(BufferContext value) + { + this.buffer = value.buffSv; + this.code = value.chrSv; + this.cCol = value.cColSv; + this.lNum = value.lNumSv; + } + // =================== End Nested classes ======================= + +#if !NOFILES + public Scanner(Stream file) { + SetSource(file); // no unicode option + } +#endif // !NOFILES + + public Scanner() { } + + private long readPos; + + void GetCode() + { + if (code == '\n') // This needs to be fixed for other conventions + // i.e. [\r\n\205\u2028\u2029] + { + cCol = -1; + lNum++; + } + readPos = buffer.Pos; + + // Now read new codepoint. + code = buffer.Read(); + if (code > ScanBuff.EndOfFile) + { +#if (!BYTEMODE) + if (code >= 0xD800 && code <= 0xDBFF) + { + int next = buffer.Read(); + if (next < 0xDC00 || next > 0xDFFF) + code = ScanBuff.UnicodeReplacementChar; + else + code = (0x10000 + ((code & 0x3FF) << 10) + (next & 0x3FF)); + } +#endif + cCol++; + } + } + + void MarkToken() + { +#if (!PERSIST) + buffer.Mark(); +#endif + tokPos = readPos; + tokLin = lNum; + tokCol = cCol; + } + + void MarkEnd() + { + tokTxt = null; + tokEPos = readPos; tokELin = lNum; tokECol = cCol; } @@ -2338,166 +3424,170 @@ int Scan() { if (yywrap()) return (int)Tokens.EOF; break; - case 1: // Recognized '[\0]+', Shortest string "" + case 1: // Recognized '{nullbytes}', Shortest string "" ; break; case 2: // Recognized '[^)]', Shortest string "\x01" - case 7: // Recognized '[^)]', Shortest string "!" - case 8: // Recognized '[^)]', Shortest string "\"" - case 9: // Recognized '[^)]', Shortest string "#" - case 11: // Recognized '[^)]', Shortest string "&" - case 12: // Recognized '[^)]', Shortest string "'" - case 18: // Recognized '[^)]', Shortest string "." -SetValue(); return((int)Tokens.MISC); - break; - case 3: // Recognized '"\t"', Shortest string "\t" -; - break; - case 4: // Recognized '[\n]', Shortest string "\n" -; + case 6: // Recognized '[^)]', Shortest string "!" + case 7: // Recognized '[^)]', Shortest string "\"" + case 8: // Recognized '[^)]', Shortest string "#" + case 10: // Recognized '[^)]', Shortest string "&" + case 11: // Recognized '[^)]', Shortest string "'" + case 15: // Recognized '[^)]', Shortest string "+" + case 17: // Recognized '[^)]', Shortest string "." +SetValue(); return((int)Tokens.MISC); break; - case 5: // Recognized '[\r]', Shortest string "\r" + case 3: // Recognized '{whitespace}', Shortest string "\t" ; break; - case 6: // Recognized '" "', Shortest string "\x20" + case 4: // Recognized '{new_line}', Shortest string "\n" + case 5: // Recognized '{new_line}', Shortest string "\r" + case 88: // Recognized '{new_line}', Shortest string "\n\r" ; break; - case 10: // Recognized '[$]', Shortest string "$" + case 9: // Recognized '{notdefined}', Shortest string "$" return((int)Tokens.NONDEF); break; - case 13: // Recognized '[(]', Shortest string "(" + case 12: // Recognized '[(]', Shortest string "(" return ('('); break; - case 14: // Recognized '[)]', Shortest string ")" + case 13: // Recognized '[)]', Shortest string ")" return (')'); break; - case 15: // Recognized '[\*]', Shortest string "*" + case 14: // Recognized '[\*]', Shortest string "*" return((int)Tokens.OVERRIDE); break; - case 16: // Recognized '[\-\+0-9][0-9]*', Shortest string "+" - case 20: // Recognized '[\-\+0-9][0-9]*', Shortest string "0" - case 63: // Recognized '[\-\+0-9][0-9]*', Shortest string "00" - case 74: // Recognized '[\-\+0-9][0-9]*', Shortest string "+0" -SetValue(); return((int)Tokens.INTEGER); - break; - case 17: // Recognized '[,]', Shortest string "," + case 16: // Recognized '[,]', Shortest string "," return (','); break; - case 19: // Recognized '[/]', Shortest string "/" + case 18: // Recognized '[/]', Shortest string "/" return ('/'); break; - case 21: // Recognized '[;]', Shortest string ";" + case 19: // Recognized '{integer}', Shortest string "0" + case 72: // Recognized '{integer}', Shortest string "+0" +SetValue(); return((int)Tokens.INTEGER); + break; + case 20: // Recognized '[;]', Shortest string ";" return (';'); break; - case 22: // Recognized '[=]', Shortest string "=" + case 21: // Recognized '[=]', Shortest string "=" return ('='); break; - case 23: // Recognized '[a-zA-Z0-9_]+', Shortest string "A" - case 24: // Recognized '[a-zA-Z0-9_]+', Shortest string "D" - case 25: // Recognized '[a-zA-Z0-9_]+', Shortest string "E" - case 26: // Recognized '[a-zA-Z0-9_]+', Shortest string "H" - case 27: // Recognized '[a-zA-Z0-9_]+', Shortest string "I" - case 28: // Recognized '[a-zA-Z0-9_]+', Shortest string "S" - case 29: // Recognized '[a-zA-Z0-9_]+', Shortest string "ST" - case 30: // Recognized '[a-zA-Z0-9_]+', Shortest string "STE" - case 31: // Recognized '[a-zA-Z0-9_]+', Shortest string "STEP" - case 33: // Recognized '[a-zA-Z0-9_]+', Shortest string "IS" - case 34: // Recognized '[a-zA-Z0-9_]+', Shortest string "ISO" - case 36: // Recognized '[a-zA-Z0-9_]+', Shortest string "HE" - case 37: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEA" - case 38: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEAD" - case 39: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEADE" - case 40: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEADER" - case 42: // Recognized '[a-zA-Z0-9_]+', Shortest string "EN" - case 43: // Recognized '[a-zA-Z0-9_]+', Shortest string "END" - case 44: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDS" - case 45: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSC" - case 46: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSE" - case 47: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDST" - case 48: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSTE" - case 49: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSTEP" - case 52: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSEC" - case 54: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSCO" - case 55: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSCOP" - case 58: // Recognized '[a-zA-Z0-9_]+', Shortest string "DA" - case 59: // Recognized '[a-zA-Z0-9_]+', Shortest string "DAT" - case 60: // Recognized '[a-zA-Z0-9_]+', Shortest string "DATA" - case 64: // Recognized '[a-zA-Z0-9_]+', Shortest string "00E" + case 22: // Recognized '[a-zA-Z0-9_]+', Shortest string "A" + case 23: // Recognized '[a-zA-Z0-9_]+', Shortest string "D" + case 24: // Recognized '[a-zA-Z0-9_]+', Shortest string "E" + case 25: // Recognized '[a-zA-Z0-9_]+', Shortest string "H" + case 26: // Recognized '[a-zA-Z0-9_]+', Shortest string "I" + case 27: // Recognized '[a-zA-Z0-9_]+', Shortest string "S" + case 28: // Recognized '[a-zA-Z0-9_]+', Shortest string "ST" + case 29: // Recognized '[a-zA-Z0-9_]+', Shortest string "STE" + case 30: // Recognized '[a-zA-Z0-9_]+', Shortest string "STEP" + case 32: // Recognized '[a-zA-Z0-9_]+', Shortest string "IS" + case 33: // Recognized '[a-zA-Z0-9_]+', Shortest string "ISO" + case 35: // Recognized '[a-zA-Z0-9_]+', Shortest string "HE" + case 36: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEA" + case 37: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEAD" + case 38: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEADE" + case 39: // Recognized '[a-zA-Z0-9_]+', Shortest string "HEADER" + case 41: // Recognized '[a-zA-Z0-9_]+', Shortest string "EN" + case 42: // Recognized '[a-zA-Z0-9_]+', Shortest string "END" + case 43: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDS" + case 44: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSC" + case 45: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSE" + case 46: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDST" + case 47: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSTE" + case 48: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSTEP" + case 51: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSEC" + case 53: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSCO" + case 54: // Recognized '[a-zA-Z0-9_]+', Shortest string "ENDSCOP" + case 57: // Recognized '[a-zA-Z0-9_]+', Shortest string "DA" + case 58: // Recognized '[a-zA-Z0-9_]+', Shortest string "DAT" + case 59: // Recognized '[a-zA-Z0-9_]+', Shortest string "DATA" + case 62: // Recognized '[a-zA-Z0-9_]+', Shortest string "0E" SetValue(); return((int)Tokens.TYPE); break; - case 32: // Recognized 'STEP;', Shortest string "STEP;" + case 31: // Recognized 'STEP;', Shortest string "STEP;" return((int)Tokens.ISOSTEPSTART); break; - case 35: // Recognized 'ISO[0-9\-]*;', Shortest string "ISO;" + case 34: // Recognized 'ISO[0-9\-]*;', Shortest string "ISO;" return((int)Tokens.ISOSTEPSTART); break; - case 41: // Recognized 'HEADER;', Shortest string "HEADER;" + case 40: // Recognized 'HEADER;', Shortest string "HEADER;" return((int)Tokens.HEADER); break; - case 50: // Recognized 'ENDSTEP;', Shortest string "ENDSTEP;" + case 49: // Recognized 'ENDSTEP;', Shortest string "ENDSTEP;" return((int)Tokens.ISOSTEPEND); break; - case 51: // Recognized '"ENDSTEP;".*', Shortest string "ENDSTEP;\x01" + case 50: // Recognized '"ENDSTEP;".*', Shortest string "ENDSTEP;\x01" return((int)Tokens.ISOSTEPEND); break; - case 53: // Recognized 'ENDSEC;', Shortest string "ENDSEC;" + case 52: // Recognized 'ENDSEC;', Shortest string "ENDSEC;" return((int)Tokens.ENDSEC); break; - case 56: // Recognized 'ENDSCOPE', Shortest string "ENDSCOPE" + case 55: // Recognized 'ENDSCOPE', Shortest string "ENDSCOPE" return((int)Tokens.ENDSCOPE); break; - case 57: // Recognized '"END-ISO"[0-9\-]*;', Shortest string "END-ISO;" + case 56: // Recognized '"END-ISO"[0-9\-]*;', Shortest string "END-ISO;" return((int)Tokens.ISOSTEPEND); break; - case 61: // Recognized 'DATA;', Shortest string "DATA;" + case 60: // Recognized 'DATA;', Shortest string "DATA;" return((int)Tokens.DATA); break; - case 62: // Recognized '[\-\+\.0-9][\.0-9]+((#INF)|(#IND))?', Shortest string "+." - case 67: // Recognized '[\-\+\.0-9][\.0-9]+((#INF)|(#IND))?', Shortest string "+.#IND" - case 69: // Recognized '[\-\+\.0-9][\.0-9]+((#INF)|(#IND))?', Shortest string ".0" -SetValue(); return((int)Tokens.FLOAT); - break; - case 65: // Recognized '[\-\+\.0-9][\.0-9]+(E|e)[\-\+0-9][0-9]*', Shortest string "+.E+" - case 66: // Recognized '[\-\+\.0-9][\.0-9]+(E|e)[\-\+0-9][0-9]*', Shortest string "00E0" - case 73: // Recognized '[\-\+\.0-9][\.0-9]+(E|e)[\-\+0-9][0-9]*', Shortest string ".0E0" + case 61: // Recognized '{real}', Shortest string "0." + case 63: // Recognized '{real}', Shortest string "0E0" + case 64: // Recognized '{real}', Shortest string "+0E0" + case 65: // Recognized '{real}', Shortest string "0#IND" + case 67: // Recognized '{real}', Shortest string ".0" + case 71: // Recognized '{real}', Shortest string ".0E0" SetValue(); return((int)Tokens.FLOAT); break; - case 68: // Recognized '"/*"', Shortest string "/*" + case 66: // Recognized '"/*"', Shortest string "/*" BEGIN(COMMENT); break; - case 70: // Recognized '[\.][U][\.]', Shortest string ".U." + case 68: // Recognized '{dot}{undefined}{dot}', Shortest string ".U." return((int)Tokens.NONDEF); break; - case 71: // Recognized '[\.][a-zA-Z0-9_ ]+[\.]', Shortest string ".\x20." + case 69: // Recognized '{dot}[a-zA-Z0-9_ ]+{dot}', Shortest string ".\x20." SetValue(); return((int)Tokens.ENUM); break; - case 72: // Recognized '[\.][TF][\.]', Shortest string ".F." + case 70: // Recognized '{dot}{boolean}{dot}', Shortest string ".F." SetValue(); return((int)Tokens.BOOLEAN); break; - case 75: // Recognized '[\']([\001-\046\050-\133\135-\377]|(\\\\)|(\'\')|(\\S\\[\040-\176])|(\\P[\101-\132]\\)|(\\X2\\([0-9A-Fa-f]{4})*\\X0\\)|(\\X4\\([0-9A-Fa-f]{8})*\\X0\\)|(\\X\\[0-9A-Fa-f]{2}))*[\']', Shortest string "''" + case 73: // Recognized '{string_literal}', Shortest string "''" + case 77: // Recognized '{string_literal}', Shortest string "'\\S\\''" + case 78: // Recognized '{string_literal}', Shortest string "'\\''" + case 79: // Recognized '{string_literal}', Shortest string "'\\\n'" SetValue(); return((int)Tokens.STRING); break; - case 76: // Recognized '&SCOPE', Shortest string "&SCOPE" + case 74: // Recognized '{bad_string_literal}', Shortest string "'\\'" + case 75: // Recognized '{bad_string_literal}', Shortest string "'\\P'" + case 76: // Recognized '{bad_string_literal}', Shortest string "" + case 80: // Recognized '{bad_string_literal}', Shortest string "'\\S\\'" +SetValue(); return((int)Tokens.INVALIDSTRING); + break; + case 81: // Recognized '{ml_string_literal}', Shortest string "'\n'" +SetValue(); return((int)Tokens.MLSTRING); + break; + case 82: // Recognized '&SCOPE', Shortest string "&SCOPE" return((int)Tokens.SCOPE); break; - case 77: // Recognized '#[0-9]+', Shortest string "#0" + case 83: // Recognized '{entity_identifier}', Shortest string "#0" SetValue(); return((int)Tokens.IDENTITY); break; - case 78: // Recognized '#[0-9]+/=', Shortest string "#0=" + case 84: // Recognized '#[0-9]+[ \t]*/=', Shortest string "#0=" _yytrunc(1); SetValue(); return((int)Tokens.ENTITY); break; - case 79: // Recognized '#[0-9]+[ \t]*/=', Shortest string "#0\t=" -_yytrunc(1); + case 85: // Recognized '{entity}', Shortest string "#0/=" SetValue(); return((int)Tokens.ENTITY); break; - case 80: // Recognized '[\"][0-9A-Fa-f]+[\"]', Shortest string "\"0\"" + case 86: // Recognized '{hexid}', Shortest string "\"0\"" SetValue(); return((int)Tokens.HEXA); break; - case 81: // Recognized '![a-zA-Z0-9_]+', Shortest string "!0" + case 87: // Recognized '![a-zA-Z0-9_]+', Shortest string "!0" SetValue(); return((int)Tokens.TYPE); break; - case 82: // In Recognized '"*/"', Shortest string "*/" + case 89: // In Recognized '"*/"', Shortest string "*/" BEGIN(INITIAL); break; default: @@ -2565,721 +3655,5 @@ internal void yy_pop_state() } // end class $Scanner - // ============================================================== - // - // This code automatically produced from an embedded resource. - // Do not edit this file, or it will become incompatible with - // the specification from which it was generated. - // - // ============================================================== - - // Code copied from GPLEX embedded resource -#if !NET8_0 - [Serializable] -#endif - public class BufferException : Exception - { - public BufferException() { } - public BufferException(string message) : base(message) { } - public BufferException(string message, Exception innerException) - : base(message, innerException) { } - -#if !NET8_0 - protected BufferException(SerializationInfo info, StreamingContext context) - : base(info, context) { } -#endif - } - - public abstract class ScanBuff - { - private string fileNm; - - public const int EndOfFile = -1; - public const int UnicodeReplacementChar = 0xFFFD; - - public bool IsFile { get { return (fileNm != null); } } - public string FileName { get { return fileNm; } set { fileNm = value; } } - - public abstract long Pos { get; set; } - public abstract int Read(); - public virtual void Mark() { } - - public abstract string GetString(long begin, long limit); - - public static ScanBuff GetBuffer(string source) - { - return new StringBuffer(source); - } - - public static ScanBuff GetBuffer(IList source) - { - return new LineBuffer(source); - } - -#if (!NOFILES) - public static ScanBuff GetBuffer(Stream source) - { - return new BuildBuffer(source); - } - -#if (!BYTEMODE) - public static ScanBuff GetBuffer(Stream source, int fallbackCodePage) - { - return new BuildBuffer(source, fallbackCodePage); - } -#endif // !BYTEMODE -#endif // !NOFILES - } - - #region Buffer classes - - // ============================================================== - // ===== Definitions for various ScanBuff derived classes ==== - // ============================================================== - // =============== String input ================ - // ============================================================== - - /// - /// This class reads characters from a single string as - /// required, for example, by Visual Studio language services - /// - sealed class StringBuffer : ScanBuff - { - string str; // input buffer - long bPos; // current position in buffer - int sLen; - - public StringBuffer(string source) - { - this.str = source; - this.sLen = source.Length; - this.FileName = null; - } - - public override int Read() - { - if (bPos < sLen) return str[(int)bPos++]; - else if (bPos == sLen) { bPos++; return '\n'; } // one strike, see new line - else { bPos++; return EndOfFile; } // two strikes and you're out! - } - - public override string GetString(long begin, long limit) - { - // "limit" can be greater than sLen with the BABEL - // option set. Read returns a "virtual" EOL if - // an attempt is made to read past the end of the - // string buffer. Without the guard any attempt - // to fetch yytext for a token that includes the - // EOL will throw an index exception. - if (limit > sLen) limit = sLen; - if (limit <= begin) return ""; - else return str.Substring((int)begin, (int)(limit - begin)); - } - - public override long Pos - { - get { return bPos; } - set { bPos = value; } - } - - public override string ToString() { return "StringBuffer"; } - } - - // ============================================================== - // The LineBuff class contributed by Nigel Horspool, - // nigelh@cs.uvic.cs - // ============================================================== - - sealed class LineBuffer : ScanBuff - { - IList line; // list of source lines from a file - int numLines; // number of strings in line list - string curLine; // current line in that list - int cLine; // index of current line in the list - int curLen; // length of current line - long curLineStart; // position of line start in whole file - long curLineEnd; // position of line end in whole file - long maxPos; // max position ever visited in whole file - long cPos; // ordinal number of code in source - - // Constructed from a list of strings, one per source line. - // The lines have had trailing '\n' characters removed. - public LineBuffer(IList lineList) - { - line = lineList; - numLines = line.Count; - cPos = curLineStart = 0; - curLine = (numLines > 0 ? line[0] : ""); - maxPos = curLineEnd = curLen = curLine.Length; - cLine = 1; - FileName = null; - } - - public override int Read() - { - if (cPos < curLineEnd) - return curLine[(int)(cPos++ - curLineStart)]; - if (cPos++ == curLineEnd) - return '\n'; - if (cLine >= numLines) - return EndOfFile; - curLine = line[cLine]; - curLen = curLine.Length; - curLineStart = curLineEnd + 1; - curLineEnd = curLineStart + curLen; - if (curLineEnd > maxPos) - maxPos = curLineEnd; - cLine++; - return curLen > 0 ? curLine[0] : '\n'; - } - - // To speed up searches for the line containing a position - private long cachedPosition; - private long cachedLineStart; - private int cachedIxdex; - - // Given a position pos within the entire source, the results are - // ix -- the index of the containing line - // lstart -- the position of the first character on that line - private void findIndex(long pos, out int ix, out long lstart) - { - if (pos >= cachedPosition) - { - ix = cachedIxdex; lstart = cachedLineStart; - } - else - { - ix = 0; - lstart = 0; - } - while (ix < numLines) - { - int len = line[ix].Length + 1; - if (pos < lstart + len) break; - lstart += len; - ix++; - } - cachedPosition = pos; - cachedIxdex = ix; - cachedLineStart = lstart; - } - - public override string GetString(long begin, long limit) - { - if (begin >= maxPos || limit <= begin) return ""; - int endIx, begIx; - long begLineStart, endLineStart; - findIndex(begin, out begIx, out begLineStart); - int begCol = (int)(begin - begLineStart); - findIndex(limit, out endIx, out endLineStart); - int endCol = (int)(limit - endLineStart); - string s = line[begIx]; - if (begIx == endIx) - { - // the usual case, substring all on one line - return (endCol <= s.Length) ? - s.Substring(begCol, endCol - begCol) - : s.Substring(begCol) + "\n"; - } - // the string spans multiple lines, yuk! - StringBuilder sb = new StringBuilder(); - if (begCol < s.Length) - sb.Append(s.Substring(begCol)); - for (; ; ) - { - sb.Append("\n"); - s = line[++begIx]; - if (begIx >= endIx) break; - sb.Append(s); - } - if (endCol <= s.Length) - { - sb.Append(s.Substring(0, endCol)); - } - else - { - sb.Append(s); - sb.Append("\n"); - } - return sb.ToString(); - } - - public override long Pos - { - get { return cPos; } - set - { - cPos = value; - findIndex(cPos, out cLine, out curLineStart); - // cLine should be the *next* line after curLine. - curLine = (cLine < numLines ? line[cLine++] : ""); - curLineEnd = curLineStart + curLine.Length; - } - } - - public override string ToString() { return "LineBuffer"; } - } - -#if (!NOFILES) - // ============================================================== - // ===== class BuildBuff : for unicode text files ======== - // ============================================================== - - class BuildBuffer : ScanBuff - { - // Double buffer for char stream. - class BufferElement - { - StringBuilder bldr = new StringBuilder(); - StringBuilder next = new StringBuilder(); - long minIx; - long maxIx; - long brkIx; - bool appendToNext; - - internal BufferElement() { } - - internal long MaxIndex { get { return maxIx; } } - // internal int MinIndex { get { return minIx; } } - - internal char this[long index] - { - get - { - if (index < minIx || index >= maxIx) - throw new BufferException("Index was outside data buffer"); - else if (index < brkIx) - return bldr[(int)(index - minIx)]; - else - return next[(int)(index - brkIx)]; - } - } - - internal void Append(char[] block, int count) - { - maxIx += count; - if (appendToNext) - this.next.Append(block, 0, count); - else - { - this.bldr.Append(block, 0, count); - brkIx = maxIx; - appendToNext = true; - } - } - - internal string GetString(long start, long limit) - { - if (limit <= start) - return ""; - if (start >= minIx && limit <= maxIx) - if (limit < brkIx) // String entirely in bldr builder - return bldr.ToString((int)(start - minIx), (int)(limit - start)); - else if (start >= brkIx) // String entirely in next builder - return next.ToString((int)(start - brkIx), (int)(limit - start)); - else // Must do a string-concatenation - return - bldr.ToString((int)(start - minIx), (int)(brkIx - start)) + - next.ToString(0, (int)(limit - brkIx)); - else - throw new BufferException("String was outside data buffer"); - } - - internal void Mark(long limit) - { - if (limit > brkIx + 16) // Rotate blocks - { - StringBuilder temp = bldr; - bldr = next; - next = temp; - next.Length = 0; - minIx = brkIx; - brkIx = maxIx; - } - } - } - - BufferElement data = new BufferElement(); - - long bPos; // Postion index in the StringBuilder - BlockReader NextBlk; // Delegate that serves char-arrays; - - private string EncodingName - { - get - { - StreamReader rdr = NextBlk.Target as StreamReader; - return (rdr == null ? "raw-bytes" : rdr.CurrentEncoding.BodyName); - } - } - - public BuildBuffer(Stream stream) - { - FileStream fStrm = (stream as FileStream); - if (fStrm != null) FileName = fStrm.Name; - NextBlk = BlockReaderFactory.Raw(stream); - } - -#if (!BYTEMODE) - public BuildBuffer(Stream stream, int fallbackCodePage) - { - FileStream fStrm = (stream as FileStream); - if (fStrm != null) FileName = fStrm.Name; - NextBlk = BlockReaderFactory.Get(stream, fallbackCodePage); - } -#endif - - /// - /// Marks a conservative lower bound for the buffer, - /// allowing space to be reclaimed. If an application - /// needs to call GetString at arbitrary past locations - /// in the input stream, Mark() is not called. - /// - public override void Mark() { data.Mark(bPos - 2); } - - public override long Pos - { - get { return bPos; } - set { bPos = value; } - } - - - /// - /// Read returns the ordinal number of the next char, or - /// EOF (-1) for an end of stream. Note that the next - /// code point may require *two* calls of Read(). - /// - /// - public override int Read() - { - // - // Characters at positions - // [data.offset, data.offset + data.bldr.Length) - // are available in data.bldr. - // - if (bPos < data.MaxIndex) - { - // ch0 cannot be EOF - return (int)data[bPos++]; - } - else // Read from underlying stream - { - // Experimental code, blocks of page size - char[] chrs = new char[4096]; - int count = NextBlk(chrs, 0, 4096); - if (count == 0) - return EndOfFile; - else - { - data.Append(chrs, count); - return (int)data[bPos++]; - } - } - } - - public override string GetString(long begin, long limit) - { - return data.GetString(begin, limit); - } - - public override string ToString() - { - return "StringBuilder buffer, encoding: " + this.EncodingName; - } - } - - // =============== End ScanBuff-derived classes ================== - - public delegate int BlockReader(char[] block, int index, int number); - - // A delegate factory, serving up a delegate that - // reads a block of characters from the underlying - // encoded stream, via a StreamReader object. - // - public static class BlockReaderFactory - { - public static BlockReader Raw(Stream stream) - { - return delegate(char[] block, int index, int number) - { - byte[] b = new byte[number]; - int count = stream.Read(b, 0, number); - int i = 0; - int j = index; - for (; i < count; i++, j++) - block[j] = (char)b[i]; - return count; - }; - } - -#if (!BYTEMODE) - public static BlockReader Get(Stream stream, int fallbackCodePage) - { - Encoding encoding; - int preamble = Preamble(stream); - - if (preamble != 0) // There is a valid BOM here! - encoding = Encoding.GetEncoding(preamble); - else if (fallbackCodePage == -1) // Fallback is "raw" bytes - return Raw(stream); - else if (fallbackCodePage != -2) // Anything but "guess" - encoding = Encoding.GetEncoding(fallbackCodePage); - else // This is the "guess" option - { - int guess = new Guesser(stream).GuessCodePage(); - stream.Seek(0, SeekOrigin.Begin); - if (guess == -1) // ==> this is a 7-bit file - encoding = Encoding.ASCII; - else if (guess == 65001) - encoding = Encoding.UTF8; - else // ==> use the machine default - encoding = Encoding.Default; - } - StreamReader reader = new StreamReader(stream, encoding); - return reader.Read; - } - - static int Preamble(Stream stream) - { - int b0 = stream.ReadByte(); - int b1 = stream.ReadByte(); - - if (b0 == 0xfe && b1 == 0xff) - return 1201; // UTF16BE - if (b0 == 0xff && b1 == 0xfe) - return 1200; // UTF16LE - - int b2 = stream.ReadByte(); - if (b0 == 0xef && b1 == 0xbb && b2 == 0xbf) - return 65001; // UTF8 - // - // There is no unicode preamble, so we - // return denoter for the machine default. - // - stream.Seek(0, SeekOrigin.Begin); - return 0; - } -#endif // !BYTEMODE - } -#endif // !NOFILES - #endregion Buffer classes - - // ============================================================== - // ============ class CodePageHandling ============= - // ============================================================== -#if (!NOFILES) - public static class CodePageHandling - { - public static int GetCodePage(string option) - { - string command = option.ToUpperInvariant(); - if (command.StartsWith("CodePage:", StringComparison.OrdinalIgnoreCase)) - command = command.Substring(9); - try - { - if (command.Equals("RAW")) - return -1; - else if (command.Equals("GUESS")) - return -2; - else if (command.Equals("DEFAULT")) - return 0; - else if (char.IsDigit(command[0])) - return int.Parse(command, CultureInfo.InvariantCulture); - else - { - Encoding enc = Encoding.GetEncoding(command); - return enc.CodePage; - } - } - catch (FormatException) - { - Console.Error.WriteLine( - "Invalid format \"{0}\", using machine default", option); - } - catch (ArgumentException) - { - Console.Error.WriteLine( - "Unknown code page \"{0}\", using machine default", option); - } - return 0; - } - } -#region guesser -#if (!BYTEMODE) - // ============================================================== - // ============ Encoding Guesser ============= - // ============================================================== - - /// - /// This class provides a simple finite state automaton that - /// scans the file looking for (1) valid UTF-8 byte patterns, - /// (2) bytes >= 0x80 which are not part of a UTF-8 sequence. - /// The method then guesses whether it is UTF-8 or maybe some - /// local machine default encoding. This works well for the - /// various Latin encodings. - /// - internal class Guesser - { - ScanBuff buffer; - - public int GuessCodePage() { return Scan(); } - - const int maxAccept = 10; - const int initial = 0; - const int eofNum = 0; - const int goStart = -1; - const int INITIAL = 0; - const int EndToken = 0; - - #region user code - /* - * Reads the bytes of a file to determine if it is - * UTF-8 or a single-byte code page file. - */ - public long utfX; - public long uppr; - #endregion user code - - int state; - int currentStart = startState[0]; - int code; - - #region ScannerTables - static int[] startState = new int[] { 11, 0 }; - - #region CharacterMap - static sbyte[] map = new sbyte[256] { -/* '\0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* '\x10' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* '\x20' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* '0' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* '@' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 'P' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* '`' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 'p' */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* '\x80' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -/* '\x90' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -/* '\xA0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -/* '\xB0' */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -/* '\xC0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -/* '\xD0' */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -/* '\xE0' */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -/* '\xF0' */ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5 }; - #endregion - - static sbyte[][] nextState = new sbyte[][] { - new sbyte[] {0, 0, 0, 0, 0, 0}, - new sbyte[] {-1, -1, 10, -1, -1, -1}, - new sbyte[] {-1, -1, -1, -1, -1, -1}, - new sbyte[] {-1, -1, 8, -1, -1, -1}, - new sbyte[] {-1, -1, 5, -1, -1, -1}, - new sbyte[] {-1, -1, 6, -1, -1, -1}, - new sbyte[] {-1, -1, 7, -1, -1, -1}, - null, - new sbyte[] {-1, -1, 9, -1, -1, -1}, - null, - null, - new sbyte[] {-1, 1, 2, 3, 4, 2} - }; - - - [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] - // Reason for suppression: cannot have self-reference in array initializer. - static Guesser() - { - nextState[7] = nextState[2]; - nextState[9] = nextState[2]; - nextState[10] = nextState[2]; - } - - int NextState() - { - if (code == ScanBuff.EndOfFile) - return eofNum; - else - return nextState[state][map[code]]; - } - #endregion - - public Guesser(System.IO.Stream file) { SetSource(file); } - - public void SetSource(System.IO.Stream source) - { - this.buffer = new BuildBuffer(source); - code = buffer.Read(); - } - - int Scan() - { - for (; ; ) - { - int next; - state = currentStart; - while ((next = NextState()) == goStart) - code = buffer.Read(); - - state = next; - code = buffer.Read(); - - while ((next = NextState()) > eofNum) - { - state = next; - code = buffer.Read(); - } - if (state <= maxAccept) - { - #region ActionSwitch -#pragma warning disable 162 - switch (state) - { - case eofNum: - switch (currentStart) - { - case 11: - if (utfX == 0 && uppr == 0) return -1; /* raw ascii */ - else if (uppr * 10 > utfX) return 0; /* default code page */ - else return 65001; /* UTF-8 encoding */ - break; - } - return EndToken; - case 1: // Recognized '{Upper128}', Shortest string "\xC0" - case 2: // Recognized '{Upper128}', Shortest string "\x80" - case 3: // Recognized '{Upper128}', Shortest string "\xE0" - case 4: // Recognized '{Upper128}', Shortest string "\xF0" - uppr++; - break; - case 5: // Recognized '{Utf8pfx4}{Utf8cont}', Shortest string "\xF0\x80" - uppr += 2; - break; - case 6: // Recognized '{Utf8pfx4}{Utf8cont}{2}', Shortest string "\xF0\x80\x80" - uppr += 3; - break; - case 7: // Recognized '{Utf8pfx4}{Utf8cont}{3}', Shortest string "\xF0\x80\x80\x80" - utfX += 3; - break; - case 8: // Recognized '{Utf8pfx3}{Utf8cont}', Shortest string "\xE0\x80" - uppr += 2; - break; - case 9: // Recognized '{Utf8pfx3}{Utf8cont}{2}', Shortest string "\xE0\x80\x80" - utfX += 2; - break; - case 10: // Recognized '{Utf8pfx2}{Utf8cont}', Shortest string "\xC0\x80" - utfX++; - break; - default: - break; - } -#pragma warning restore 162 - #endregion - } - } - } - } // end class Guesser - -#endif // !BYTEMODE -#endregion -#endif // !NOFILES - -// End of code copied from embedded resource } // end namespace diff --git a/Xbim.Common/Step21/Parser/StepP21Lex.lex b/Xbim.Common/Step21/Parser/StepP21Lex.lex index e40aa9a95..5b589ba89 100644 --- a/Xbim.Common/Step21/Parser/StepP21Lex.lex +++ b/Xbim.Common/Step21/Parser/StepP21Lex.lex @@ -13,34 +13,88 @@ } %} +whitespace [ \t] +new_line "\n\r"|\r|\n|"\r\n" +nullbytes [\0]+ + +sign ("-"|"+")? + +digit [0-9] +digit10 {digit} +digit16 [0-9a-fA-F] +uinteger10 ({digit10})+ +uinteger16 ({digit16})+ +integer {sign}{uinteger10} +exponent_marker [Ee] +exponent_suffix ({exponent_marker}{sign}({digit10})+)? +infinite "#INF" +not_a_number "#IND" +ureal (({uinteger10}{exponent_suffix})|("."({digit10})+{exponent_suffix})|(({digit10})+"."({digit10})*{exponent_suffix})) +real ({sign}{ureal}({infinite}|{not_a_number})?) +hexid \"{uinteger16}\" + +equals /= +entity_identifier #{uinteger10} +entity {entity_identifier}{equals} +entity_ws ({entity_identifier}({whitespace})*{equals}) + +single_string_char [^\\\'\r\n] +string_escape_char \\{2}|\'{2} + +string_solidus_s \\S\\[\040-\176] +string_solidus_p \\P[A-I]\\ +string_solidus_x \\X\\({digit16}{2}) +string_x_close \\X0\\ +string_solidus_x2 \\X2\\({digit16}{4})*{string_x_close} +string_solidus_x4 \\X4\\({digit16}{8})*{string_x_close} +string_encoding_char {string_solidus_s}|{string_solidus_p}|{string_solidus_x}|{string_solidus_x2}|{string_solidus_x4} +string_invalid_tolerated \\[^SPX\\] + +reg_string_char {single_string_char}|{string_escape_char}|{string_encoding_char}|{string_invalid_tolerated} +string_literal \'({reg_string_char})*\' + +strict_string_char {single_string_char}|{string_escape_char}|{string_encoding_char}| +bad_string_literal \'(({strict_string_char})*\\({strict_string_char})*)+\' + +ml_single_string_char [^\\\'] +ml_string_char {ml_single_string_char}|{string_escape_char}|{string_encoding_char}|{string_invalid_tolerated} +ml_string_literal \'({ml_string_char})*\' + +dot "." +boolean [TF] +undefined "U" +notdefined "$" + %% %{ %} -"\t" {;} -" " {;} -[\n] {;} -[\r] {;} -[\0]+ {;} -#[0-9]+/= { SetValue(); return((int)Tokens.ENTITY); } -#[0-9]+[ \t]*/= { SetValue(); return((int)Tokens.ENTITY); } -#[0-9]+ { SetValue(); return((int)Tokens.IDENTITY);} -[\-\+0-9][0-9]* { SetValue(); return((int)Tokens.INTEGER); } -[\-\+\.0-9][\.0-9]+((#INF)|(#IND))? { SetValue(); return((int)Tokens.FLOAT); } -[\-\+\.0-9][\.0-9]+(E|e)[\-\+0-9][0-9]* { SetValue(); return((int)Tokens.FLOAT); } -[\']([\001-\046\050-\133\135-\377]|(\\\\)|(\'\')|(\\S\\[\040-\176])|(\\P[\101-\132]\\)|(\\X2\\([0-9A-Fa-f]{4})*\\X0\\)|(\\X4\\([0-9A-Fa-f]{8})*\\X0\\)|(\\X\\[0-9A-Fa-f]{2}))*[\'] { SetValue(); return((int)Tokens.STRING); } -[\"][0-9A-Fa-f]+[\"] {SetValue(); return((int)Tokens.HEXA); } -[\.][TF][\.] {SetValue(); return((int)Tokens.BOOLEAN); } -[\.][U][\.] {return((int)Tokens.NONDEF); } -[\.][a-zA-Z0-9_ ]+[\.] {SetValue(); return((int)Tokens.ENUM); } -[$] {return((int)Tokens.NONDEF); } + +{whitespace} {;} +{new_line} {;} +{nullbytes} {;} +{entity} { SetValue(); return((int)Tokens.ENTITY); } +#[0-9]+[ \t]*/= { SetValue(); return((int)Tokens.ENTITY); } +{entity_identifier} { SetValue(); return((int)Tokens.IDENTITY);} +{integer} { SetValue(); return((int)Tokens.INTEGER); } +{real} { SetValue(); return((int)Tokens.FLOAT); } + +{string_literal} { SetValue(); return((int)Tokens.STRING); } +{ml_string_literal} { SetValue(); return((int)Tokens.MLSTRING); } +{bad_string_literal} { SetValue(); return((int)Tokens.INVALIDSTRING); } + +{hexid} { SetValue(); return((int)Tokens.HEXA); } +{dot}{boolean}{dot} { SetValue(); return((int)Tokens.BOOLEAN); } +{dot}{undefined}{dot} { return((int)Tokens.NONDEF); } +{dot}[a-zA-Z0-9_ ]+{dot} { SetValue(); return((int)Tokens.ENUM); } +{notdefined} { return((int)Tokens.NONDEF); } [(] { return ('('); } [)] { return (')'); } [,] { return (','); } -[\*] { return((int)Tokens.OVERRIDE); } [=] { return ('='); } [;] { return (';'); } +[\*] { return((int)Tokens.OVERRIDE); } "/*" { BEGIN(COMMENT); } @@ -48,23 +102,21 @@ "*/" { BEGIN(INITIAL); } } - -STEP; { return((int)Tokens.ISOSTEPSTART); } -HEADER; { return((int)Tokens.HEADER); } -ENDSEC; { return((int)Tokens.ENDSEC); } -DATA; { return((int)Tokens.DATA); } -ENDSTEP; { return((int)Tokens.ISOSTEPEND); } +STEP; { return((int)Tokens.ISOSTEPSTART); } +HEADER; { return((int)Tokens.HEADER); } +ENDSEC; { return((int)Tokens.ENDSEC); } +DATA; { return((int)Tokens.DATA); } +ENDSTEP; { return((int)Tokens.ISOSTEPEND); } "ENDSTEP;".* { return((int)Tokens.ISOSTEPEND); } "END-ISO"[0-9\-]*; { return((int)Tokens.ISOSTEPEND); } ISO[0-9\-]*; { return((int)Tokens.ISOSTEPSTART); } -[/] { return ('/'); } -&SCOPE { return((int)Tokens.SCOPE); } -ENDSCOPE { return((int)Tokens.ENDSCOPE); } -[a-zA-Z0-9_]+ { SetValue(); return((int)Tokens.TYPE); } +[/] { return ('/'); } +&SCOPE { return((int)Tokens.SCOPE); } +ENDSCOPE { return((int)Tokens.ENDSCOPE); } +[a-zA-Z0-9_]+ { SetValue(); return((int)Tokens.TYPE); } ![a-zA-Z0-9_]+ { SetValue(); return((int)Tokens.TYPE); } -[^)] {SetValue(); return((int)Tokens.MISC); } - +[^)] { SetValue(); return((int)Tokens.MISC); } %{ yylloc = new LexLocation(tokLin,tokCol,tokELin,tokECol); diff --git a/Xbim.Common/Step21/Parser/StepP21Parser.cs b/Xbim.Common/Step21/Parser/StepP21Parser.cs index 220e89ba1..f066b1386 100644 --- a/Xbim.Common/Step21/Parser/StepP21Parser.cs +++ b/Xbim.Common/Step21/Parser/StepP21Parser.cs @@ -3,10 +3,10 @@ // (see accompanying GPPGcopyright.rtf) // GPPG version 1.5.2 -// Machine: MAC3 -// DateTime: 24/03/2022 23:03:40 -// UserName: Claudio -// Input file +// Machine: ANDY-XBIM +// DateTime: 25/03/2025 15:48:09 +// UserName: AndyWard +// Input file // options: lines gplex @@ -23,7 +23,7 @@ public enum Tokens {error=63,EOF=64,ISOSTEPSTART=65,HEADER=66, ENDSEC=67,DATA=68,ISOSTEPEND=69,SCOPE=70,ENDSCOPE=71,ENTITY=72, TYPE=73,INTEGER=74,FLOAT=75,STRING=76,BOOLEAN=77,IDENTITY=78, TEXT=79,NONDEF=80,OVERRIDE=81,ENUM=82,HEXA=83,ILLEGALCHAR=84, - MISC=85}; + MISC=85,MLSTRING=86,INVALIDSTRING=87}; public partial struct ValueType #line 10 "StepP21Parser.y" @@ -53,17 +53,17 @@ public ScanObj( int t, ValueType val, LexLocation loc ) { [GeneratedCodeAttribute( "Gardens Point Parser Generator", "1.5.2")] public partial class P21Parser: ShiftReduceParser { - // Verbatim content from StepP21Parser.y - 10/06/2019 14:40:47 + // Verbatim content from StepP21Parser.y - 25/03/2025 15:18:04 #line 2 "StepP21Parser.y" public bool InHeader = false; #line default - // End verbatim content from StepP21Parser.y - 10/06/2019 14:40:47 + // End verbatim content from StepP21Parser.y - 25/03/2025 15:18:04 #pragma warning disable 649 private static Dictionary aliases; #pragma warning restore 649 - private static Rule[] rules = new Rule[62]; - private static State[] states = new State[97]; + private static Rule[] rules = new Rule[64]; + private static State[] states = new State[99]; private static string[] nonTerms = new string[] { "stepFile", "trailingSpace", "$accept", "endStep", "beginStep", "startHeader", "stepFile1", "headerEntities", "endSec", "endOfHeader", "model", "stepFile2", @@ -73,42 +73,42 @@ public partial class P21Parser: ShiftReduceParser }; static P21Parser() { - states[0] = new State(new int[]{65,93,72,72,63,73},new int[]{-1,1,-7,3,-5,4,-12,94,-13,95,-11,96,-22,77,-23,19}); + states[0] = new State(new int[]{65,95,72,74,63,75},new int[]{-1,1,-7,3,-5,4,-12,96,-13,97,-11,98,-22,79,-23,19}); states[1] = new State(new int[]{64,2}); states[2] = new State(-1); states[3] = new State(-11); - states[4] = new State(new int[]{66,92},new int[]{-6,5}); - states[5] = new State(new int[]{73,54,84,55,63,84,67,17},new int[]{-8,6,-9,85,-14,91,-15,81}); - states[6] = new State(new int[]{67,17,73,54,84,55,63,84},new int[]{-9,7,-14,80,-15,81}); - states[7] = new State(new int[]{68,79},new int[]{-10,8}); - states[8] = new State(new int[]{72,72,63,73},new int[]{-11,9,-22,77,-23,19}); - states[9] = new State(new int[]{67,17,72,72,63,73},new int[]{-9,10,-22,16,-23,19}); + states[4] = new State(new int[]{66,94},new int[]{-6,5}); + states[5] = new State(new int[]{73,56,84,57,63,86,67,17},new int[]{-8,6,-9,87,-14,93,-15,83}); + states[6] = new State(new int[]{67,17,73,56,84,57,63,86},new int[]{-9,7,-14,82,-15,83}); + states[7] = new State(new int[]{68,81},new int[]{-10,8}); + states[8] = new State(new int[]{72,74,63,75},new int[]{-11,9,-22,79,-23,19}); + states[9] = new State(new int[]{67,17,72,74,63,75},new int[]{-9,10,-22,16,-23,19}); states[10] = new State(new int[]{69,12},new int[]{-4,11}); states[11] = new State(-8); states[12] = new State(new int[]{32,15,64,-4},new int[]{-2,13}); states[13] = new State(new int[]{32,14,64,-5}); states[14] = new State(-3); states[15] = new State(-2); - states[16] = new State(-43); + states[16] = new State(-45); states[17] = new State(new int[]{32,15,68,-15,69,-15},new int[]{-2,18}); states[18] = new State(new int[]{32,14,68,-16,69,-16}); states[19] = new State(new int[]{61,20}); - states[20] = new State(new int[]{73,54,84,55,40,56,70,78},new int[]{-24,21,-25,23,-15,28}); + states[20] = new State(new int[]{73,56,84,57,40,58,70,80},new int[]{-24,21,-25,23,-15,28}); states[21] = new State(new int[]{59,22}); - states[22] = new State(-44); - states[23] = new State(new int[]{72,72,63,73,71,63},new int[]{-11,24,-26,74,-22,77,-23,19}); - states[24] = new State(new int[]{71,63,72,72,63,73},new int[]{-26,25,-22,16,-23,19}); - states[25] = new State(new int[]{73,54,84,55,40,56},new int[]{-24,26,-15,28}); + states[22] = new State(-46); + states[23] = new State(new int[]{72,74,63,75,71,65},new int[]{-11,24,-26,76,-22,79,-23,19}); + states[24] = new State(new int[]{71,65,72,74,63,75},new int[]{-26,25,-22,16,-23,19}); + states[25] = new State(new int[]{73,56,84,57,40,58},new int[]{-24,26,-15,28}); states[26] = new State(new int[]{59,27}); - states[27] = new State(-45); - states[28] = new State(new int[]{40,46},new int[]{-16,29,-19,30}); - states[29] = new State(-50); - states[30] = new State(new int[]{63,52,41,51,78,36,74,37,75,38,76,39,77,40,82,41,83,42,80,43,81,44,40,46,73,49},new int[]{-20,31,-21,32,-17,53,-16,45,-19,30,-18,47}); - states[31] = new State(-36); - states[32] = new State(new int[]{44,34,63,50,41,51},new int[]{-20,33}); - states[33] = new State(-37); - states[34] = new State(new int[]{78,36,74,37,75,38,76,39,77,40,82,41,83,42,80,43,81,44,40,46,73,49},new int[]{-17,35,-16,45,-19,30,-18,47}); - states[35] = new State(-40); + states[27] = new State(-47); + states[28] = new State(new int[]{40,48},new int[]{-16,29,-19,30}); + states[29] = new State(-52); + states[30] = new State(new int[]{63,54,41,53,78,36,74,37,75,38,76,39,86,40,87,41,77,42,82,43,83,44,80,45,81,46,40,48,73,51},new int[]{-20,31,-21,32,-17,55,-16,47,-19,30,-18,49}); + states[31] = new State(-38); + states[32] = new State(new int[]{44,34,63,52,41,53},new int[]{-20,33}); + states[33] = new State(-39); + states[34] = new State(new int[]{78,36,74,37,75,38,76,39,86,40,87,41,77,42,82,43,83,44,80,45,81,46,40,48,73,51},new int[]{-17,35,-16,47,-19,30,-18,49}); + states[35] = new State(-42); states[36] = new State(-22); states[37] = new State(-23); states[38] = new State(-24); @@ -119,57 +119,59 @@ static P21Parser() { states[43] = new State(-29); states[44] = new State(-30); states[45] = new State(-31); - states[46] = new State(-34); - states[47] = new State(new int[]{40,46},new int[]{-16,48,-19,30}); - states[48] = new State(-32); - states[49] = new State(-33); - states[50] = new State(-41); + states[46] = new State(-32); + states[47] = new State(-33); + states[48] = new State(-36); + states[49] = new State(new int[]{40,48},new int[]{-16,50,-19,30}); + states[50] = new State(-34); states[51] = new State(-35); - states[52] = new State(-38); - states[53] = new State(-39); - states[54] = new State(-60); - states[55] = new State(-61); - states[56] = new State(new int[]{73,54,84,55},new int[]{-27,57,-15,61}); - states[57] = new State(new int[]{41,58,73,54,84,55},new int[]{-15,59}); - states[58] = new State(-51); - states[59] = new State(new int[]{40,46},new int[]{-16,60,-19,30}); - states[60] = new State(-49); - states[61] = new State(new int[]{40,46},new int[]{-16,62,-19,30}); - states[62] = new State(-48); - states[63] = new State(new int[]{47,71,73,-57,84,-57,40,-57},new int[]{-30,64}); - states[64] = new State(new int[]{78,69},new int[]{-29,65,-28,70}); - states[65] = new State(new int[]{47,66,44,67}); - states[66] = new State(-58); - states[67] = new State(new int[]{78,69},new int[]{-28,68}); - states[68] = new State(-55); - states[69] = new State(-53); - states[70] = new State(-54); - states[71] = new State(-56); - states[72] = new State(-59); - states[73] = new State(-47); - states[74] = new State(new int[]{73,54,84,55,40,56},new int[]{-24,75,-15,28}); - states[75] = new State(new int[]{59,76}); - states[76] = new State(-46); - states[77] = new State(-42); - states[78] = new State(-52); - states[79] = new State(-21); - states[80] = new State(-18); - states[81] = new State(new int[]{40,46},new int[]{-16,82,-19,30}); - states[82] = new State(new int[]{59,83}); - states[83] = new State(-19); - states[84] = new State(-20); - states[85] = new State(new int[]{68,79},new int[]{-10,86}); - states[86] = new State(new int[]{72,72,63,73},new int[]{-11,87,-22,77,-23,19}); - states[87] = new State(new int[]{63,90,67,17,72,72},new int[]{-9,88,-22,16,-23,19}); - states[88] = new State(new int[]{69,12},new int[]{-4,89}); - states[89] = new State(-9); - states[90] = new State(new int[]{64,-10,63,-47,67,-47,72,-47}); - states[91] = new State(-17); - states[92] = new State(-7); - states[93] = new State(-6); - states[94] = new State(-12); - states[95] = new State(-13); - states[96] = new State(new int[]{72,72,63,73,64,-14},new int[]{-22,16,-23,19}); + states[52] = new State(-43); + states[53] = new State(-37); + states[54] = new State(-40); + states[55] = new State(-41); + states[56] = new State(-62); + states[57] = new State(-63); + states[58] = new State(new int[]{73,56,84,57},new int[]{-27,59,-15,63}); + states[59] = new State(new int[]{41,60,73,56,84,57},new int[]{-15,61}); + states[60] = new State(-53); + states[61] = new State(new int[]{40,48},new int[]{-16,62,-19,30}); + states[62] = new State(-51); + states[63] = new State(new int[]{40,48},new int[]{-16,64,-19,30}); + states[64] = new State(-50); + states[65] = new State(new int[]{47,73,73,-59,84,-59,40,-59},new int[]{-30,66}); + states[66] = new State(new int[]{78,71},new int[]{-29,67,-28,72}); + states[67] = new State(new int[]{47,68,44,69}); + states[68] = new State(-60); + states[69] = new State(new int[]{78,71},new int[]{-28,70}); + states[70] = new State(-57); + states[71] = new State(-55); + states[72] = new State(-56); + states[73] = new State(-58); + states[74] = new State(-61); + states[75] = new State(-49); + states[76] = new State(new int[]{73,56,84,57,40,58},new int[]{-24,77,-15,28}); + states[77] = new State(new int[]{59,78}); + states[78] = new State(-48); + states[79] = new State(-44); + states[80] = new State(-54); + states[81] = new State(-21); + states[82] = new State(-18); + states[83] = new State(new int[]{40,48},new int[]{-16,84,-19,30}); + states[84] = new State(new int[]{59,85}); + states[85] = new State(-19); + states[86] = new State(-20); + states[87] = new State(new int[]{68,81},new int[]{-10,88}); + states[88] = new State(new int[]{72,74,63,75},new int[]{-11,89,-22,79,-23,19}); + states[89] = new State(new int[]{63,92,67,17,72,74},new int[]{-9,90,-22,16,-23,19}); + states[90] = new State(new int[]{69,12},new int[]{-4,91}); + states[91] = new State(-9); + states[92] = new State(new int[]{64,-10,63,-49,67,-49,72,-49}); + states[93] = new State(-17); + states[94] = new State(-7); + states[95] = new State(-6); + states[96] = new State(-12); + states[97] = new State(-13); + states[98] = new State(new int[]{72,74,63,75,64,-14},new int[]{-22,16,-23,19}); for (int sNo = 0; sNo < states.Length; sNo++) states[sNo].number = sNo; @@ -198,42 +200,44 @@ static P21Parser() { rules[23] = new Rule(-17, new int[]{74}); rules[24] = new Rule(-17, new int[]{75}); rules[25] = new Rule(-17, new int[]{76}); - rules[26] = new Rule(-17, new int[]{77}); - rules[27] = new Rule(-17, new int[]{82}); - rules[28] = new Rule(-17, new int[]{83}); - rules[29] = new Rule(-17, new int[]{80}); - rules[30] = new Rule(-17, new int[]{81}); - rules[31] = new Rule(-17, new int[]{-16}); - rules[32] = new Rule(-17, new int[]{-18,-16}); - rules[33] = new Rule(-18, new int[]{73}); - rules[34] = new Rule(-19, new int[]{40}); - rules[35] = new Rule(-20, new int[]{41}); - rules[36] = new Rule(-16, new int[]{-19,-20}); - rules[37] = new Rule(-16, new int[]{-19,-21,-20}); - rules[38] = new Rule(-16, new int[]{-19,63}); - rules[39] = new Rule(-21, new int[]{-17}); - rules[40] = new Rule(-21, new int[]{-21,44,-17}); - rules[41] = new Rule(-21, new int[]{-21,63}); - rules[42] = new Rule(-11, new int[]{-22}); - rules[43] = new Rule(-11, new int[]{-11,-22}); - rules[44] = new Rule(-22, new int[]{-23,61,-24,59}); - rules[45] = new Rule(-22, new int[]{-23,61,-25,-11,-26,-24,59}); - rules[46] = new Rule(-22, new int[]{-23,61,-25,-26,-24,59}); - rules[47] = new Rule(-22, new int[]{63}); - rules[48] = new Rule(-27, new int[]{-15,-16}); - rules[49] = new Rule(-27, new int[]{-27,-15,-16}); - rules[50] = new Rule(-24, new int[]{-15,-16}); - rules[51] = new Rule(-24, new int[]{40,-27,41}); - rules[52] = new Rule(-25, new int[]{70}); - rules[53] = new Rule(-28, new int[]{78}); - rules[54] = new Rule(-29, new int[]{-28}); - rules[55] = new Rule(-29, new int[]{-29,44,-28}); - rules[56] = new Rule(-30, new int[]{47}); - rules[57] = new Rule(-26, new int[]{71}); - rules[58] = new Rule(-26, new int[]{71,-30,-29,47}); - rules[59] = new Rule(-23, new int[]{72}); - rules[60] = new Rule(-15, new int[]{73}); - rules[61] = new Rule(-15, new int[]{84}); + rules[26] = new Rule(-17, new int[]{86}); + rules[27] = new Rule(-17, new int[]{87}); + rules[28] = new Rule(-17, new int[]{77}); + rules[29] = new Rule(-17, new int[]{82}); + rules[30] = new Rule(-17, new int[]{83}); + rules[31] = new Rule(-17, new int[]{80}); + rules[32] = new Rule(-17, new int[]{81}); + rules[33] = new Rule(-17, new int[]{-16}); + rules[34] = new Rule(-17, new int[]{-18,-16}); + rules[35] = new Rule(-18, new int[]{73}); + rules[36] = new Rule(-19, new int[]{40}); + rules[37] = new Rule(-20, new int[]{41}); + rules[38] = new Rule(-16, new int[]{-19,-20}); + rules[39] = new Rule(-16, new int[]{-19,-21,-20}); + rules[40] = new Rule(-16, new int[]{-19,63}); + rules[41] = new Rule(-21, new int[]{-17}); + rules[42] = new Rule(-21, new int[]{-21,44,-17}); + rules[43] = new Rule(-21, new int[]{-21,63}); + rules[44] = new Rule(-11, new int[]{-22}); + rules[45] = new Rule(-11, new int[]{-11,-22}); + rules[46] = new Rule(-22, new int[]{-23,61,-24,59}); + rules[47] = new Rule(-22, new int[]{-23,61,-25,-11,-26,-24,59}); + rules[48] = new Rule(-22, new int[]{-23,61,-25,-26,-24,59}); + rules[49] = new Rule(-22, new int[]{63}); + rules[50] = new Rule(-27, new int[]{-15,-16}); + rules[51] = new Rule(-27, new int[]{-27,-15,-16}); + rules[52] = new Rule(-24, new int[]{-15,-16}); + rules[53] = new Rule(-24, new int[]{40,-27,41}); + rules[54] = new Rule(-25, new int[]{70}); + rules[55] = new Rule(-28, new int[]{78}); + rules[56] = new Rule(-29, new int[]{-28}); + rules[57] = new Rule(-29, new int[]{-29,44,-28}); + rules[58] = new Rule(-30, new int[]{47}); + rules[59] = new Rule(-26, new int[]{71}); + rules[60] = new Rule(-26, new int[]{71,-30,-29,47}); + rules[61] = new Rule(-23, new int[]{72}); + rules[62] = new Rule(-15, new int[]{73}); + rules[63] = new Rule(-15, new int[]{84}); } protected override void Initialize() { @@ -249,162 +253,172 @@ protected override void DoAction(int action) switch (action) { case 4: // endStep -> ISOSTEPEND -#line 38 "StepP21Parser.y" +#line 40 "StepP21Parser.y" {EndParse();} #line default break; case 5: // endStep -> ISOSTEPEND, trailingSpace -#line 40 "StepP21Parser.y" +#line 42 "StepP21Parser.y" {EndParse();} #line default break; case 6: // beginStep -> ISOSTEPSTART -#line 43 "StepP21Parser.y" +#line 45 "StepP21Parser.y" {BeginParse(); } #line default break; case 7: // startHeader -> HEADER -#line 48 "StepP21Parser.y" +#line 50 "StepP21Parser.y" {InHeader=true; BeginHeader();} #line default break; case 14: // stepFile -> model -#line 59 "StepP21Parser.y" +#line 61 "StepP21Parser.y" { EndParse(); } #line default break; case 15: // endSec -> ENDSEC -#line 62 "StepP21Parser.y" +#line 64 "StepP21Parser.y" {EndSec();} #line default break; case 16: // endSec -> ENDSEC, trailingSpace -#line 63 "StepP21Parser.y" +#line 65 "StepP21Parser.y" {EndSec();} #line default break; case 19: // headerEntity -> entityType, listArgument, ';' -#line 69 "StepP21Parser.y" +#line 71 "StepP21Parser.y" {EndHeaderEntity();} #line default break; case 21: // endOfHeader -> DATA -#line 73 "StepP21Parser.y" +#line 75 "StepP21Parser.y" { InHeader=false; EndHeader(); } #line default break; case 22: // argument -> IDENTITY -#line 76 "StepP21Parser.y" +#line 78 "StepP21Parser.y" {SetObjectValue(CurrentSemanticValue.strVal);} #line default break; case 23: // argument -> INTEGER -#line 77 "StepP21Parser.y" +#line 79 "StepP21Parser.y" {SetIntegerValue(CurrentSemanticValue.strVal);} #line default break; case 24: // argument -> FLOAT -#line 78 "StepP21Parser.y" +#line 80 "StepP21Parser.y" {SetFloatValue(CurrentSemanticValue.strVal);} #line default break; case 25: // argument -> STRING -#line 79 "StepP21Parser.y" +#line 81 "StepP21Parser.y" {SetStringValue(CurrentSemanticValue.strVal);} #line default break; - case 26: // argument -> BOOLEAN -#line 80 "StepP21Parser.y" + case 26: // argument -> MLSTRING +#line 82 "StepP21Parser.y" + {SetStringValue(CurrentSemanticValue.strVal);} +#line default + break; + case 27: // argument -> INVALIDSTRING +#line 83 "StepP21Parser.y" + {SetInvalidStringValue(CurrentSemanticValue.strVal);} +#line default + break; + case 28: // argument -> BOOLEAN +#line 84 "StepP21Parser.y" {SetBooleanValue(CurrentSemanticValue.strVal);} #line default break; - case 27: // argument -> ENUM -#line 81 "StepP21Parser.y" + case 29: // argument -> ENUM +#line 85 "StepP21Parser.y" {SetEnumValue(CurrentSemanticValue.strVal);} #line default break; - case 28: // argument -> HEXA -#line 82 "StepP21Parser.y" + case 30: // argument -> HEXA +#line 86 "StepP21Parser.y" {SetHexValue(CurrentSemanticValue.strVal);} #line default break; - case 29: // argument -> NONDEF -#line 83 "StepP21Parser.y" + case 31: // argument -> NONDEF +#line 87 "StepP21Parser.y" {SetNonDefinedValue();} #line default break; - case 30: // argument -> OVERRIDE -#line 84 "StepP21Parser.y" + case 32: // argument -> OVERRIDE +#line 88 "StepP21Parser.y" {SetOverrideValue();} #line default break; - case 32: // argument -> listType, listArgument -#line 86 "StepP21Parser.y" + case 34: // argument -> listType, listArgument +#line 90 "StepP21Parser.y" {EndNestedType(CurrentSemanticValue.strVal);} #line default break; - case 33: // listType -> TYPE -#line 90 "StepP21Parser.y" + case 35: // listType -> TYPE +#line 94 "StepP21Parser.y" { BeginNestedType(CurrentSemanticValue.strVal); } #line default break; - case 34: // beginList -> '(' -#line 93 "StepP21Parser.y" + case 36: // beginList -> '(' +#line 97 "StepP21Parser.y" { BeginList(); } #line default break; - case 35: // endList -> ')' -#line 96 "StepP21Parser.y" + case 37: // endList -> ')' +#line 100 "StepP21Parser.y" { EndList(); } #line default break; - case 41: // argumentList -> argumentList, error -#line 104 "StepP21Parser.y" + case 43: // argumentList -> argumentList, error +#line 108 "StepP21Parser.y" {SetErrorMessage();} #line default break; - case 44: // bloc -> entityLabel, '=', entity, ';' -#line 109 "StepP21Parser.y" + case 46: // bloc -> entityLabel, '=', entity, ';' +#line 113 "StepP21Parser.y" {EndEntity();} #line default break; - case 45: // bloc -> entityLabel, '=', beginScope, model, endScope, entity, ';' -#line 110 "StepP21Parser.y" + case 47: // bloc -> entityLabel, '=', beginScope, model, endScope, entity, ';' +#line 114 "StepP21Parser.y" {EndEntity();} #line default break; - case 46: // bloc -> entityLabel, '=', beginScope, endScope, entity, ';' -#line 111 "StepP21Parser.y" + case 48: // bloc -> entityLabel, '=', beginScope, endScope, entity, ';' +#line 115 "StepP21Parser.y" {EndEntity();} #line default break; - case 47: // bloc -> error -#line 112 "StepP21Parser.y" + case 49: // bloc -> error +#line 116 "StepP21Parser.y" {SetErrorMessage();EndEntity();} #line default break; - case 53: // uniqueID -> IDENTITY -#line 124 "StepP21Parser.y" + case 55: // uniqueID -> IDENTITY +#line 128 "StepP21Parser.y" { SetObjectValue(CurrentSemanticValue.strVal); } #line default break; - case 56: // beginExport -> '/' -#line 130 "StepP21Parser.y" + case 58: // beginExport -> '/' +#line 134 "StepP21Parser.y" { BeginList(); } #line default break; - case 59: // entityLabel -> ENTITY -#line 139 "StepP21Parser.y" + case 61: // entityLabel -> ENTITY +#line 143 "StepP21Parser.y" { NewEntity(CurrentSemanticValue.strVal); } #line default break; - case 60: // entityType -> TYPE -#line 142 "StepP21Parser.y" + case 62: // entityType -> TYPE +#line 146 "StepP21Parser.y" { SetType(CurrentSemanticValue.strVal); } #line default break; - case 61: // entityType -> ILLEGALCHAR -#line 145 "StepP21Parser.y" + case 63: // entityType -> ILLEGALCHAR +#line 149 "StepP21Parser.y" { CharacterError(); } #line default break; @@ -422,7 +436,7 @@ protected override string TerminalToString(int terminal) return CharToString((char)terminal); } -#line 149 "StepP21Parser.y" +#line 153 "StepP21Parser.y" #line default diff --git a/Xbim.Common/Step21/Parser/StepP21Parser.lst b/Xbim.Common/Step21/Parser/StepP21Parser.lst deleted file mode 100644 index 95dc3dafb..000000000 --- a/Xbim.Common/Step21/Parser/StepP21Parser.lst +++ /dev/null @@ -1,161 +0,0 @@ - -// ========================================================================== -// GPPG error listing for yacc source file -// ========================================================================== -// Version: 1.5.2 -// Machine: DESKTOP-VAJP4OB -// DateTime: 13/09/2017 16:52:25 -// UserName: Martin -// ========================================================================== - - -%{ - public bool InHeader = false; -%} -%namespace Xbim.IO.Parser -%partial -%parsertype P21Parser - -%start stepFile - -%union{ - public string strVal; - } -%token ISOSTEPSTART -%token HEADER -%token ENDSEC -%token DATA -%token ISOSTEPEND -%token SCOPE -%token ENDSCOPE -%token ENTITY -%token TYPE -%token INTEGER -%token FLOAT -%token STRING -%token BOOLEAN -%token IDENTITY -%token TEXT -%token NONDEF -%token OVERRIDE -%token ENUM -%token HEXA -%token ILLEGALCHAR -%token MISC - -%% -trailingSpace : ' ' - | trailingSpace ' ' ; -endStep : ISOSTEPEND{EndParse();} - | ISOSTEPEND trailingSpace - {EndParse();} - ; -beginStep : ISOSTEPSTART - {BeginParse(); } - ; - - -startHeader : HEADER - {InHeader=true; BeginHeader();} - ; - - -stepFile1 : beginStep startHeader headerEntities endSec endOfHeader model endSec endStep; -stepFile2 : beginStep startHeader endSec endOfHeader model endSec endStep ; -stepFile3 : beginStep startHeader endSec endOfHeader model error ; -stepFile : stepFile1 | stepFile2 | stepFile3 | model { EndParse(); } - -endSec : ENDSEC{EndSec();} -//^^^^ -// Error: Syntax error, unexpected anchoredSymbol -// ---------------------------------------------- - | ENDSEC trailingSpace {EndSec();} - ; - -headerEntities : headerEntity - | headerEntities headerEntity - ; -headerEntity : entityType listArgument ';' {EndHeaderEntity();} - | error - ; -endOfHeader : DATA - { InHeader=false; EndHeader(); } - ; -argument - : IDENTITY {SetObjectValue(CurrentSemanticValue.strVal);} - | INTEGER {SetIntegerValue(CurrentSemanticValue.strVal);} - | FLOAT {SetFloatValue(CurrentSemanticValue.strVal);} - | STRING {SetStringValue(CurrentSemanticValue.strVal);} - | BOOLEAN {SetBooleanValue(CurrentSemanticValue.strVal);} - | ENUM {SetEnumValue(CurrentSemanticValue.strVal);} - | HEXA {SetHexValue(CurrentSemanticValue.strVal);} - | NONDEF {SetNonDefinedValue();} - | OVERRIDE {SetOverrideValue();} - | listArgument - | listType listArgument {EndNestedType(CurrentSemanticValue.strVal);} - ; - -listType : TYPE - { BeginNestedType(CurrentSemanticValue.strVal); } - ; -beginList : '(' - { BeginList(); } - ; -endList : ')' - { EndList(); } - ; -listArgument : beginList endList - | beginList argumentList endList - | beginList error - ; -argumentList : argument - | argumentList ',' argument - | argumentList error {SetErrorMessage();} - ; -model : bloc - | model bloc - ; -bloc : entityLabel '=' entity ';' {EndEntity();} - | entityLabel '=' beginScope model endScope entity ';'{EndEntity();} - | entityLabel '=' beginScope endScope entity ';'{EndEntity();} - | error {SetErrorMessage();EndEntity();} - ; -complex : entityType listArgument /*{EndComplex();} */ - | complex entityType listArgument /* {EndComplex();} */ - ; -entity : entityType listArgument /* Simple Entity */ - | '(' complex ')' /*{BeginComplex();}*/ /* Complex */ - ; -beginScope : SCOPE - /*{ BeginScope(); }*/ - ; -uniqueID : IDENTITY - { SetObjectValue(CurrentSemanticValue.strVal); } - ; -export : uniqueID - | export ',' uniqueID - ; -beginExport : '/' - { BeginList(); } - ; -endScope : ENDSCOPE - /*{ EndScope(); }*/ - | ENDSCOPE beginExport export '/' - /*{ Console.WriteLine("*** Warning : Export List not yet processed\n"); - NewEntity(); EndScope() ; }*/ - ; -entityLabel : ENTITY - { NewEntity(CurrentSemanticValue.strVal); } - ; -entityType : TYPE - { SetType(CurrentSemanticValue.strVal); } - ; -entityType : ILLEGALCHAR - { CharacterError(); } - ; - -%% - - -// ========================================================================== - diff --git a/Xbim.Common/Step21/Parser/StepP21Parser.y b/Xbim.Common/Step21/Parser/StepP21Parser.y index 2486b3ca7..a3399ee39 100644 --- a/Xbim.Common/Step21/Parser/StepP21Parser.y +++ b/Xbim.Common/Step21/Parser/StepP21Parser.y @@ -31,6 +31,8 @@ %token HEXA %token ILLEGALCHAR %token MISC +%token MLSTRING +%token INVALIDSTRING %% trailingSpace : ' ' @@ -77,6 +79,8 @@ argument | INTEGER {SetIntegerValue(CurrentSemanticValue.strVal);} | FLOAT {SetFloatValue(CurrentSemanticValue.strVal);} | STRING {SetStringValue(CurrentSemanticValue.strVal);} + | MLSTRING {SetStringValue(CurrentSemanticValue.strVal);} + | INVALIDSTRING {SetInvalidStringValue(CurrentSemanticValue.strVal);} | BOOLEAN {SetBooleanValue(CurrentSemanticValue.strVal);} | ENUM {SetEnumValue(CurrentSemanticValue.strVal);} | HEXA {SetHexValue(CurrentSemanticValue.strVal);} diff --git a/Xbim.Common/Step21/Parser/XbimScanBuffer.cs b/Xbim.Common/Step21/Parser/XbimScanBuffer.cs index f130f9d89..17ecde97e 100644 --- a/Xbim.Common/Step21/Parser/XbimScanBuffer.cs +++ b/Xbim.Common/Step21/Parser/XbimScanBuffer.cs @@ -1,4 +1,5 @@ -using System; +using QUT.GplexBuffers; +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/Xbim.Common/Step21/Parser/gplex.frame b/Xbim.Common/Step21/Parser/gplex.frame new file mode 100644 index 000000000..5cf180180 --- /dev/null +++ b/Xbim.Common/Step21/Parser/gplex.frame @@ -0,0 +1,605 @@ +// Revised backup code +// Version 1.2.1 of 24-June-2013 +// +## Derived from gplex.frame version of 2-September-2006. +## Code page support for files without a BOM. +## Left and Right Anchored state support. +## Start condition stack. Two generic params. +## Using fixed length context handling for right anchors + +// Customised in xbim to support input files > int32 length +// +##-->defines + +using System; +using System.IO; +using System.Text; +using System.Globalization; +using System.Collections.Generic; +using System.Runtime.Serialization; +using System.Diagnostics.CodeAnalysis; + +##-->version295 +##-->usingDcl +{ + /// + /// Summary Canonical example of GPLEX automaton + /// + +#if STANDALONE + // + // These are the dummy declarations for stand-alone GPLEX applications + // normally these declarations would come from the parser. + // If you declare /noparser, or %option noparser then you get this. + // + +##-->translate $public enum $Tokens + { + EOF = 0, maxParseToken = int.MaxValue + // must have at least these two, values are almost arbitrary + } + +##-->translate $public abstract class $ScanBase + { + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yylex")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yylex")] + public abstract int yylex(); + + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yywrap")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yywrap")] + protected virtual bool yywrap() { return true; } + +#if BABEL + protected abstract int CurrentSc { get; set; } + // EolState is the 32-bit of state data persisted at + // the end of each line for Visual Studio colorization. + // The default is to return CurrentSc. You must override + // this if you want more complicated behavior. + public virtual int EolState { + get { return CurrentSc; } + set { CurrentSc = value; } + } + } + +##-->translate $public interface IColorScan + { + void SetSource(string source, int offset); + int GetNext(ref int state, out int start, out int end); +#endif // BABEL + } + +#endif // STANDALONE + + // If the compiler can't find the scanner base class maybe you + // need to run GPPG with the /gplex option, or GPLEX with /noparser +#if BABEL +##-->translate $public sealed partial class $Scanner : $ScanBase, IColorScan + { + private ScanBuff buffer; + int currentScOrd; // start condition ordinal + + protected override int CurrentSc + { + // The current start state is a property + // to try to avoid the user error of setting + // scState but forgetting to update the FSA + // start state "currentStart" + // + get { return currentScOrd; } // i.e. return YY_START; + set { currentScOrd = value; // i.e. BEGIN(value); + currentStart = startState[value]; } + } +#else // BABEL +##-->translate $public sealed partial class $Scanner : $ScanBase + { + private ScanBuff buffer; + int currentScOrd; // start condition ordinal +#endif // BABEL + + /// + /// The input buffer for this scanner. + /// + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + public ScanBuff Buffer { get { return buffer; } } + + private static int GetMaxParseToken() { +##-->translate System.Reflection.FieldInfo f = typeof($Tokens).GetField("maxParseToken"); + return (f == null ? int.MaxValue : (int)f.GetValue(null)); + } + + static int parserMax = GetMaxParseToken(); + + enum Result {accept, noMatch, contextFound}; + +##-->consts + +#region user code +##-->codeIncl +#endregion user code + + int state; + int currentStart = startState[0]; + int code; // last code read + int cCol; // column number of code + int lNum; // current line number + // + // The following instance variables are used, among other + // things, for constructing the yylloc location objects. + // + long tokPos; // buffer position at start of token + int tokCol; // zero-based column number at start of token + int tokLin; // line number at start of token + long tokEPos; // buffer position at end of token + int tokECol; // column number at end of token + int tokELin; // line number at end of token + string tokTxt; // lazily constructed text of token +#if STACK + private Stack scStack = new Stack(); +#endif // STACK + +##-->tableDef + + +#if BACKUP + // ============================================================== + // == Nested struct used for backup in automata that do backup == + // ============================================================== + + struct Context // class used for automaton backup. + { + public long bPos; + public long rPos; // scanner.readPos saved value + public int cCol; + public int lNum; // Need this in case of backup over EOL. + public int state; + public int cChr; + } + + private Context ctx = new Context(); +#endif // BACKUP + + // ============================================================== + // ==== Nested struct to support input switching in scanners ==== + // ============================================================== + + struct BufferContext { + internal ScanBuff buffSv; + internal int chrSv; + internal int cColSv; + internal int lNumSv; + } + + // ============================================================== + // ===== Private methods to save and restore buffer contexts ==== + // ============================================================== + + /// + /// This method creates a buffer context record from + /// the current buffer object, together with some + /// scanner state values. + /// + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + BufferContext MkBuffCtx() + { + BufferContext rslt; + rslt.buffSv = this.buffer; + rslt.chrSv = this.code; + rslt.cColSv = this.cCol; + rslt.lNumSv = this.lNum; + return rslt; + } + + /// + /// This method restores the buffer value and allied + /// scanner state from the given context record value. + /// + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + void RestoreBuffCtx(BufferContext value) + { + this.buffer = value.buffSv; + this.code = value.chrSv; + this.cCol = value.cColSv; + this.lNum = value.lNumSv; + } + // =================== End Nested classes ======================= + +#if !NOFILES +##-->translate $public $Scanner(Stream file) { +##-->bufferCtor + } +#endif // !NOFILES + +##-->translate $public $Scanner() { } + + private long readPos; + + void GetCode() + { + if (code == '\n') // This needs to be fixed for other conventions + // i.e. [\r\n\205\u2028\u2029] + { + cCol = -1; + lNum++; + } + readPos = buffer.Pos; + + // Now read new codepoint. + code = buffer.Read(); + if (code > ScanBuff.EndOfFile) + { +#if (!BYTEMODE) + if (code >= 0xD800 && code <= 0xDBFF) + { + int next = buffer.Read(); + if (next < 0xDC00 || next > 0xDFFF) + code = ScanBuff.UnicodeReplacementChar; + else + code = (0x10000 + ((code & 0x3FF) << 10) + (next & 0x3FF)); + } +#endif + cCol++; + } + } + + void MarkToken() + { +#if (!PERSIST) + buffer.Mark(); +#endif + tokPos = readPos; + tokLin = lNum; + tokCol = cCol; + } + + void MarkEnd() + { + tokTxt = null; + tokEPos = readPos; + tokELin = lNum; + tokECol = cCol; + } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + int Peek() + { + int rslt, codeSv = code, cColSv = cCol, lNumSv = lNum; + long bPosSv = buffer.Pos; + GetCode(); rslt = code; + lNum = lNumSv; cCol = cColSv; code = codeSv; buffer.Pos = bPosSv; + return rslt; + } + + // ============================================================== + // ===== Initialization of string-based input buffers ==== + // ============================================================== + + /// + /// Create and initialize a StringBuff buffer object for this scanner + /// + /// the input string + /// starting offset in the string + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + public void SetSource(string source, int offset) + { + this.buffer = ScanBuff.GetBuffer(source); + this.buffer.Pos = offset; + this.lNum = 0; + this.code = '\n'; // to initialize yyline, yycol and lineStart + GetCode(); + } + + // ================ LineBuffer Initialization =================== + /// + /// Create and initialize a LineBuff buffer object for this scanner + /// + /// the list of input strings + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + public void SetSource(IList source) + { + this.buffer = ScanBuff.GetBuffer(source); + this.code = '\n'; // to initialize yyline, yycol and lineStart + this.lNum = 0; + GetCode(); + } + +#if !NOFILES + // =============== StreamBuffer Initialization ================== + + /// + /// Create and initialize a StreamBuff buffer object for this scanner. + /// StreamBuff is buffer for 8-bit byte files. + /// + /// the input byte stream + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + public void SetSource(Stream source) + { + this.buffer = ScanBuff.GetBuffer(source); + this.lNum = 0; + this.code = '\n'; // to initialize yyline, yycol and lineStart + GetCode(); + } + +#if !BYTEMODE + // ================ TextBuffer Initialization =================== + + /// + /// Create and initialize a TextBuff buffer object for this scanner. + /// TextBuff is a buffer for encoded unicode files. + /// + /// the input text file + /// Code page to use if file has + /// no BOM. For 0, use machine default; for -1, 8-bit binary + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + public void SetSource(Stream source, int fallbackCodePage) + { + this.buffer = ScanBuff.GetBuffer(source, fallbackCodePage); + this.lNum = 0; + this.code = '\n'; // to initialize yyline, yycol and lineStart + GetCode(); + } +#endif // !BYTEMODE +#endif // !NOFILES + + // ============================================================== + +#if BABEL + // + // Get the next token for Visual Studio + // + // "state" is the inout mode variable that maintains scanner + // state between calls, using the EolState property. In principle, + // if the calls of EolState are costly set could be called once + // only per line, at the start; and get called only at the end + // of the line. This needs more infrastructure ... + // + public int GetNext(ref int state, out int start, out int end) + { +##-->translate $Tokens next; + int s, e; + s = state; // state at start + EolState = state; +##-->translate next = ($Tokens)Scan(); + state = EolState; + e = state; // state at end; + start = tokPos; + end = tokEPos - 1; // end is the index of last char. + return (int)next; + } +#endif // BABEL + + // ======== AbstractScanner<> Implementation ========= + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yylex")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yylex")] + public override int yylex() + { + // parserMax is set by reflecting on the Tokens + // enumeration. If maxParseToken is defined + // that is used, otherwise int.MaxValue is used. + int next; + do { next = Scan(); } while (next >= parserMax); + return next; + } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + long yypos { get { return tokPos; } } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + int yyline { get { return tokLin; } } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + int yycol { get { return tokCol; } } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yytext")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yytext")] + public string yytext + { + get + { + if (tokTxt == null) + tokTxt = buffer.GetString(tokPos, tokEPos); + return tokTxt; + } + } + + /// + /// Discards all but the first "n" codepoints in the recognized pattern. + /// Resets the buffer position so that only n codepoints have been consumed; + /// yytext is also re-evaluated. + /// + /// The number of codepoints to consume + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + void yyless(long n) + { + buffer.Pos = tokPos; + // Must read at least one char, so set before start. + cCol = tokCol - 1; + GetCode(); + // Now ensure that line counting is correct. + lNum = tokLin; + // And count the rest of the text. + for (int i = 0; i < n; i++) GetCode(); + MarkEnd(); + } + + // + // It would be nice to count backward in the text + // but it does not seem possible to re-establish + // the correct column counts except by going forward. + // + /// + /// Removes the last "n" code points from the pattern. + /// + /// The number to remove + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + void _yytrunc(int n) { yyless(yyleng - n); } + + // + // This is painful, but we no longer count + // codepoints. For the overwhelming majority + // of cases the single line code is fast, for + // the others, well, at least it is all in the + // buffer so no files are touched. Note that we + // can't use (tokEPos - tokPos) because of the + // possibility of surrogate pairs in the token. + // + /// + /// The length of the pattern in codepoints (not the same as + /// string-length if the pattern contains any surrogate pairs). + /// + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "yyleng")] + [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "yyleng")] + public long yyleng + { + get { + if (tokELin == tokLin) + return tokECol - tokCol; + else +#if BYTEMODE + return tokEPos - tokPos; +#else + { + int ch; + int count = 0; + int save = buffer.Pos; + buffer.Pos = tokPos; + do { + ch = buffer.Read(); + if (!char.IsHighSurrogate((char)ch)) count++; + } while (buffer.Pos < tokEPos && ch != ScanBuff.EndOfFile); + buffer.Pos = save; + return count; + } +#endif // BYTEMODE + } + } + + // ============ methods available in actions ============== + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal int YY_START { + get { return currentScOrd; } + set { currentScOrd = value; + currentStart = startState[value]; + } + } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal void BEGIN(int next) { + currentScOrd = next; + currentStart = startState[next]; + } + + // ============== The main tokenizer code ================= + + int Scan() { +##-->prolog + for (; ; ) { + int next; // next state to enter +#if LEFTANCHORS + for (;;) { + // Discard characters that do not start any pattern. + // Must check the left anchor condition after *every* GetCode! + state = ((cCol == 0) ? anchorState[currentScOrd] : currentStart); + if ((next = NextState()) != goStart) break; // LOOP EXIT HERE... + GetCode(); + } + +#else // !LEFTANCHORS + state = currentStart; + while ((next = NextState()) == goStart) { + // At this point, the current character has no + // transition from the current state. We discard + // the "no-match" char. In traditional LEX such + // characters are echoed to the console. + GetCode(); + } +#endif // LEFTANCHORS + // At last, a valid transition ... + MarkToken(); + state = next; + GetCode(); +#if BACKUP + bool contextSaved = false; + while ((next = NextState()) > eofNum) { // Exit for goStart AND for eofNum + if (state <= maxAccept && next > maxAccept) { // need to prepare backup data + // Store data for the *latest* accept state that was found. + SaveStateAndPos( ref ctx ); + contextSaved = true; + } + state = next; + GetCode(); + } + if (state > maxAccept && contextSaved) + RestoreStateAndPos( ref ctx ); +#else // BACKUP + while ((next = NextState()) > eofNum) { // Exit for goStart AND for eofNum + state = next; + GetCode(); + } +#endif // BACKUP + if (state <= maxAccept) { + MarkEnd(); +##-->actionCases + } + } +##-->epilog + } + +#if BACKUP + void SaveStateAndPos(ref Context ctx) { + ctx.bPos = buffer.Pos; + ctx.rPos = readPos; + ctx.cCol = cCol; + ctx.lNum = lNum; + ctx.state = state; + ctx.cChr = code; + } + + void RestoreStateAndPos(ref Context ctx) { + buffer.Pos = ctx.bPos; + readPos = ctx.rPos; + cCol = ctx.cCol; + lNum = ctx.lNum; + state = ctx.state; + code = ctx.cChr; + } +#endif // BACKUP + + // ============= End of the tokenizer code ================ + +#if STACK + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal void yy_clear_stack() { scStack.Clear(); } + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal int yy_top_state() { return scStack.Peek(); } + + internal void yy_push_state(int state) + { + scStack.Push(currentScOrd); + BEGIN(state); + } + + internal void yy_pop_state() + { + // Protect against input errors that pop too far ... + if (scStack.Count > 0) { + int newSc = scStack.Pop(); + BEGIN(newSc); + } // Otherwise leave stack unchanged. + } + #endif // STACK + + [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal void ECHO() { Console.Out.Write(yytext); } + +##-->userCode + } // end class $Scanner + +##-->embeddedBuffers + +} // end namespace diff --git a/Xbim.Common/Step21/Parser/gplex.pdf b/Xbim.Common/Step21/Parser/gplex.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ce0d5bb8549e7c55a971718fe85591fb2cf8f311 GIT binary patch literal 728603 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
  • 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


    |+S(e=9Lllw(cSq0wC7 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

    U%CmIbS^0_-oa( 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 literal 0 HcmV?d00001 diff --git a/Xbim.Common/Step21/StepTextHelper.cs b/Xbim.Common/Step21/StepTextHelper.cs index 0461db23a..354177d06 100644 --- a/Xbim.Common/Step21/StepTextHelper.cs +++ b/Xbim.Common/Step21/StepTextHelper.cs @@ -74,10 +74,22 @@ public static string ToPart21(this string source) return sb.ToString(); } + ///

    + /// ISO 10646 encoding types + /// private enum WriteState { + /// + /// Single Byte : \X\{hex2} + /// Normal, + /// + /// Double Byte : \X2\{hex4}+\X0\ + /// TwoBytes, + /// + /// Quad Byte : \X4\{hex8}+\X0\ + /// FourBytes } diff --git a/Xbim.Common/Step21/XbimP21Parser.cs b/Xbim.Common/Step21/XbimP21Parser.cs index 0071e19b0..6d9bab201 100644 --- a/Xbim.Common/Step21/XbimP21Parser.cs +++ b/Xbim.Common/Step21/XbimP21Parser.cs @@ -271,6 +271,12 @@ protected override void SetStringValue(string value) SetEntityParameter(value); } + protected override void SetInvalidStringValue(string value) + { + PropertyValue.Init(value, StepParserType.String); + SetEntityParameter(value); + } + protected override void SetEnumValue(string value) { PropertyValue.Init(value.Trim('.'), StepParserType.Enum); diff --git a/Xbim.Common/Step21/XbimP21Scanner.cs b/Xbim.Common/Step21/XbimP21Scanner.cs index cee24524c..58e445e44 100644 --- a/Xbim.Common/Step21/XbimP21Scanner.cs +++ b/Xbim.Common/Step21/XbimP21Scanner.cs @@ -31,6 +31,7 @@ using Xbim.IO.Parser; using Xbim.IO.Step21.Parser; + #endregion namespace Xbim.IO.Step21 @@ -155,6 +156,8 @@ public bool Parse(bool onlyHeader = false) if (tok >= 63) { Tokens t = (Tokens)tok; + + //Logger.LogInformation("Token {tok}: [{type}] {val}", t, this.CurrentInstance?.Entity, _scanner.yylval.strVal); switch (t) { case Tokens.HEADER: @@ -198,6 +201,16 @@ public bool Parse(bool onlyHeader = false) case Tokens.STRING: SetStringValue(_scanner.yylval.strVal); break; + case Tokens.MLSTRING: + SetStringValue(_scanner.yylval.strVal); + break; + case Tokens.INVALIDSTRING: + var last = GetLastEntity(); + Logger.LogWarning("Incorrectly escaped string found on #{entityId}={entity} at Line {line} Col {pos} : {string}", + last.EntityLabel, last.Entity.GetType().Name.ToUpperInvariant(), + _scanner.yylloc.StartLine, _scanner.yylloc.StartColumn, _scanner.yylval.strVal); + SetStringValue(_scanner.yylval.strVal); + break; case Tokens.BOOLEAN: SetBooleanValue(_scanner.yylval.strVal); break; @@ -216,7 +229,6 @@ public bool Parse(bool onlyHeader = false) case Tokens.OVERRIDE: SetOverrideValue(); break; - case Tokens.TEXT: case Tokens.error: case Tokens.ILLEGALCHAR: @@ -384,8 +396,11 @@ protected void NewEntity(/*ReadOnlySpan*/ string entityLabel) //last entity wasn't properly finished if (_processStack.Count > 0) { - var last = _processStack.Pop(); - Logger.LogError(LogEventIds.FailedEntity, $"Entity #{last.EntityLabel}={last.Entity?.GetType().Name.ToUpperInvariant()} wasn't closed and finished properly."); + + var last = GetLastEntity(); + + Logger.LogError(LogEventIds.FailedEntity, "Entity #{entityId}={entityType} was not fully parsed.", + last.EntityLabel, last.Entity?.GetType().Name.ToUpperInvariant()); _processStack.Clear(); ErrorCount++; @@ -396,6 +411,11 @@ protected void NewEntity(/*ReadOnlySpan*/ string entityLabel) NewEntity(label); } + protected Part21Entity GetLastEntity() + { + return _processStack.FirstOrDefault(e => e.EntityLabel > 0) ?? _processStack.Peek(); + } + private int _reportEntityCount = 0; private void NewEntity(int entityLabel) { @@ -507,6 +527,12 @@ protected void SetStringValue(string value) SetEntityParameter(value); } + protected void SetInvalidStringValue(string value) + { + PropertyValue.Init(value, StepParserType.String); + SetEntityParameter(value); + } + protected void SetEnumValue(string value) { PropertyValue.Init(value.Trim('.'), StepParserType.Enum); diff --git a/Xbim.IO.Esent/Esent/XbimP21Indexer.cs b/Xbim.IO.Esent/Esent/XbimP21Indexer.cs index 4047ccb82..80a5539d5 100644 --- a/Xbim.IO.Esent/Esent/XbimP21Indexer.cs +++ b/Xbim.IO.Esent/Esent/XbimP21Indexer.cs @@ -19,6 +19,7 @@ using System.Diagnostics; using System.Globalization; using System.IO; +using System.Linq; using System.Threading.Tasks; using Xbim.Common; using Xbim.Common.Step21; @@ -75,6 +76,7 @@ public class P21ToIndexParser : P21Parser, IDisposable private PropertyValue _propertyValue; private int _listNestLevel = -1; private readonly StepFileHeader _header = new StepFileHeader(StepFileHeader.HeaderCreationMode.LeaveEmpty, new EsentModel()); + private readonly ILogger _logger; public StepFileHeader Header { @@ -107,16 +109,17 @@ internal P21ToIndexParser(Stream inputP21, long streamSize, EsentEntityCursor t _entityCount = 0; _streamSize = streamSize; _codePageOverride = codePageOverride; + _logger = loggerFactory.CreateLogger(); } protected override void SetErrorMessage() { - Debug.WriteLine("TODO"); + _logger.LogWarning("Parse Error at [{line}, {col}-{endCol}] on #{entityId}={entityType} : {value}", Scanner.yylloc.StartLine, Scanner.yylloc.StartColumn, Scanner.yylloc.EndColumn, _currentLabel, _currentType, Scanner.yylval.strVal); } protected override void CharacterError() { - Debug.WriteLine("TODO"); + _logger?.LogWarning("Error parsing IFC File, illegal character found"); } protected override void BeginParse() @@ -445,6 +448,20 @@ protected override void SetStringValue(string value) _currentInstance.CurrentParamIndex++; } + protected override void SetInvalidStringValue(string value) + { + var last = GetLastEntity(); + _logger.LogWarning("Incorrectly escaped string found on #{entityId}={entity} at Line {line} Col {pos} : {string}", + last.EntityLabel, last.Entity.GetType().Name.ToUpperInvariant(), + Scanner.yylloc.StartLine, Scanner.yylloc.StartColumn, Scanner.yylval.strVal); + SetStringValue(value); + } + + protected Part21Entity GetLastEntity() + { + return _processStack.FirstOrDefault(e => e.EntityLabel > 0) ?? _processStack.Peek(); + } + protected override void SetEnumValue(string value) { if (InHeader) diff --git a/Xbim.IO.Esent/HeuristicModelProvider.cs b/Xbim.IO.Esent/HeuristicModelProvider.cs index 93bbfcae1..bdeef22d7 100644 --- a/Xbim.IO.Esent/HeuristicModelProvider.cs +++ b/Xbim.IO.Esent/HeuristicModelProvider.cs @@ -333,10 +333,13 @@ public override IModel Open(string path, XbimSchemaVersion schemaVersion, double else if (storageType.HasFlag(StorageType.IfcXml)) model.LoadXml(path, progDelegate); - // if we are looking at a memory model loaded from a file it might be safe to fix the file name in the - // header with the actual file loaded - FileInfo f = new FileInfo(path); - model.Header.FileName.Name = f.FullName; + if(string.IsNullOrEmpty(model.Header.FileName.Name)) + { + // if we are looking at a memory model loaded from a file it might be safe to fix the file name in the + // header with the actual file loaded + FileInfo f = new FileInfo(path); + model.Header.FileName.Name = f.FullName; + } return model; } } From 2ec7561c811781c8a6cb6bd4d01c3c3a74eb147f Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Tue, 25 Mar 2025 23:47:36 +0000 Subject: [PATCH 13/16] Fixed up test issues after late change to how StepHeader FileName is set in Store Added spot fix for special characters in IfcXmlWriter3 --- Tests/TolerantFormatConversionTests.cs | 59 ++++------------------ Xbim.IO.Esent/HeuristicModelProvider.cs | 7 --- Xbim.IO.MemoryModel/Xml/IfcXmlWriter3.cs | 64 +++++++++++++++++++++++- Xbim.Ifc/IfcStore.cs | 46 +++++++++-------- Xbim.Ifc/XbimReferencedModel.cs | 12 ++++- 5 files changed, 108 insertions(+), 80 deletions(-) diff --git a/Tests/TolerantFormatConversionTests.cs b/Tests/TolerantFormatConversionTests.cs index 35d30955f..d6ad68f34 100644 --- a/Tests/TolerantFormatConversionTests.cs +++ b/Tests/TolerantFormatConversionTests.cs @@ -12,66 +12,25 @@ namespace Xbim.IO.Tests [TestClass] public class TolerantFormatConversionTests { - // this test is known to fail... There's an encoded backspace in the file name inside the header that cannot be persiste to xml. - // should the system tolerate the fault? - // for the time being I've improved the error message so that the problem in the file is easier to resolve. - // + // this test was known to fail... There's an encoded control code (\b) in the file name inside the header that cannot be persisted to xml + // without further encoding [TestMethod] public void ForConsideration_SaveTroublesomeFile() { - long count; - int ErrFiles = 0; - - var sb = new StringBuilder(); var outfile = new FileInfo("out.ifczip"); if (outfile.Exists) outfile.Delete(); + var file = "TestFiles\\BackSpaceInFileName.ifc"; - var files = new List(); - files.Add(new FileInfo("TestFiles\\BackSpaceInFileName.ifc")); + using var store = IfcStore.Open(file); - foreach (var file in files) - { - try - { - using (var store = IfcStore.Open(file.FullName)) - { - count = store.Instances.Count; - store.SaveAs( - outfile.FullName, - StorageType.IfcZip | StorageType.IfcXml - ); - store.Close(); - } - } - catch (Exception ex) - { - ErrFiles++; - sb.AppendLine($"Failed for {file.FullName}"); - var e = ex; - while (e!= null) - { - sb.AppendLine($"{e.Message}"); - e = e.InnerException; - } - sb.AppendLine("==="); - } - if (outfile.Exists) - outfile.Delete(); - } - var errors = sb.ToString(); - if (!string.IsNullOrEmpty(errors)) - { - var rep = $"{ErrFiles} files with problems\r\n\r\n{errors}"; - var repoutfile = new FileInfo("report.txt"); - using (var fw = repoutfile.CreateText()) - { - fw.WriteLine(rep); - } - throw new Exception(rep); - } + store.SaveAs(outfile.FullName, StorageType.IfcZip | StorageType.IfcXml); + store.Close(); + + if (outfile.Exists) + outfile.Delete(); } } } diff --git a/Xbim.IO.Esent/HeuristicModelProvider.cs b/Xbim.IO.Esent/HeuristicModelProvider.cs index bdeef22d7..f3ae17f50 100644 --- a/Xbim.IO.Esent/HeuristicModelProvider.cs +++ b/Xbim.IO.Esent/HeuristicModelProvider.cs @@ -333,13 +333,6 @@ public override IModel Open(string path, XbimSchemaVersion schemaVersion, double else if (storageType.HasFlag(StorageType.IfcXml)) model.LoadXml(path, progDelegate); - if(string.IsNullOrEmpty(model.Header.FileName.Name)) - { - // if we are looking at a memory model loaded from a file it might be safe to fix the file name in the - // header with the actual file loaded - FileInfo f = new FileInfo(path); - model.Header.FileName.Name = f.FullName; - } return model; } } diff --git a/Xbim.IO.MemoryModel/Xml/IfcXmlWriter3.cs b/Xbim.IO.MemoryModel/Xml/IfcXmlWriter3.cs index 2cd79dda3..d65216f79 100644 --- a/Xbim.IO.MemoryModel/Xml/IfcXmlWriter3.cs +++ b/Xbim.IO.MemoryModel/Xml/IfcXmlWriter3.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Text; using System.Xml; using Xbim.Common; using Xbim.Common.Metadata; @@ -151,7 +152,8 @@ private void WriteInHeader(XmlWriter output, string prefix, string localName, st { try { - output.WriteElementString(prefix, localName, ns, value); + var encoded = XmlString(value); + output.WriteElementString(prefix, localName, ns, encoded); } catch (Exception e) { @@ -429,5 +431,65 @@ private void WriteProperty(string propName, Type propType, object propVal, objec //else // throw new Exception(string.Format("Entity of type {0} has illegal property {1} of type {2}", entity.GetType().ToString(), propType.Name, propType.Name)); } + + // Based on https://github.com/RickStrahl/Westwind.Utilities/blob/master/Westwind.Utilities/Utilities/XmlUtils.c + /// + /// Turns a string into a properly XML Encoded string. + /// Uses simple string replacement. + /// + /// Plain text to convert to XML Encoded string + /// + /// If true encodes single and double quotes. + /// When embedding element values quotes don't need to be encoded. + /// When embedding attributes quotes need to be encoded. + /// + /// XML encoded string + private static string XmlString(string text, bool isAttribute = false) + { + if (string.IsNullOrEmpty(text)) + return text; + + var sb = new StringBuilder(text.Length); + foreach (var chr in text) + { + if (chr == '<') + sb.Append("<"); + else if (chr == '>') + sb.Append(">"); + else if (chr == '&') + sb.Append("&"); + + if (isAttribute) + { + // special handling for quotes + if (chr == '\"') + sb.Append("""); + else if (chr == '\'') + sb.Append("'"); + + // Legal sub-chr32 characters + else if (chr == '\n') + sb.Append(" "); + else if (chr == '\r') + sb.Append(" "); + else if (chr == '\t') + sb.Append(" "); + } + else + { + if (chr < 32) + { + uint c = Convert.ToUInt32(chr); + sb.AppendFormat(@"&#{0:X};", c); + } + else + { + sb.Append(chr); + } + } + } + + return sb.ToString(); + } } } \ No newline at end of file diff --git a/Xbim.Ifc/IfcStore.cs b/Xbim.Ifc/IfcStore.cs index 03481cdd7..ff2ee9fb7 100644 --- a/Xbim.Ifc/IfcStore.cs +++ b/Xbim.Ifc/IfcStore.cs @@ -97,7 +97,7 @@ protected IfcStore() protected IfcStore(string filepath, XbimSchemaVersion ifcVersion, XbimEditorCredentials editorDetails) : this() { var model = ModelProvider.Create(ifcVersion, filepath); - AssignModel(model, editorDetails, ifcVersion); + AssignModel(model, editorDetails, ifcVersion, filepath); } /// @@ -150,16 +150,16 @@ public static IModelProviderFactory ModelProviderFactory set; } - private void AssignModel(IModel model, XbimEditorCredentials editorDetails, XbimSchemaVersion schema) + private void AssignModel(IModel model, XbimEditorCredentials editorDetails, XbimSchemaVersion schema, string modelPath = null) { Model = model; Model.EntityNew += Model_EntityNew; Model.EntityDeleted += Model_EntityDeleted; Model.EntityModified += Model_EntityModified; - FileName = Model.Header.FileName.Name; + FileName = modelPath ?? Model.Header.FileName.Name; SetupEditing(editorDetails); - LoadReferenceModels(); + LoadReferenceModels(modelPath); IO.Memory.MemoryModel.CalculateModelFactors(model); } @@ -343,8 +343,16 @@ public static IfcStore Open(string path, XbimEditorCredentials editorDetails = n } var model = newStore.ModelProvider.Open(path, ifcVersion, ifcDatabaseSizeThreshHold, progDelegate, accessMode, codePageOverride); - - newStore.AssignModel(model, editorDetails, ifcVersion); + if (string.IsNullOrEmpty(model.Header.FileName.Name)) + { + // if we are looking at a memory model loaded from a file it might be safe to fix the file name in the + // header with the actual file loaded + // historically setting this Filename to local IFC Path isd what enabled + // Federations to find their relative child models. + FileInfo f = new FileInfo(path); + model.Header.FileName.Name = f.FullName; + } + newStore.AssignModel(model, editorDetails, ifcVersion, path); return newStore; } @@ -932,31 +940,27 @@ private XbimReferencedModel AddModelReference(string refModelPath, Ifc4.ActorRes /// /// Loading referenced models defaults to avoiding Exception on file not found; in this way the federated model can still be opened and the error rectified. /// + /// Path to the root model /// Set to true to enable your own error handling - private void LoadReferenceModels(bool throwErrorOnReferenceModelExceptions = false) + private void LoadReferenceModels(string rootModelPath, bool throwErrorOnReferenceModelExceptions = false) { var docInfos = Instances.OfType().Where(d => d.IntendedUse == RefDocument); foreach (var docInfo in docInfos) { - if (throwErrorOnReferenceModelExceptions) + try { - // throw exception on referenceModel Creation - AddModelReference(new XbimReferencedModel(docInfo)); + AddModelReference(new XbimReferencedModel(docInfo, rootModelPath)); } - else + catch (Exception ex) { // do not throw exception on referenceModel Creation - try - { - AddModelReference(new XbimReferencedModel(docInfo)); - } - catch (Exception ex) - { - Logger?.LogError( - string.Format("Ignored exception on modelreference load for #{0}.", docInfo.EntityLabel), - ex); - } + if (throwErrorOnReferenceModelExceptions) + throw; + Logger?.LogError( + string.Format("Ignored exception on modelreference load for #{0}.", docInfo.EntityLabel), + ex); } + } } diff --git a/Xbim.Ifc/XbimReferencedModel.cs b/Xbim.Ifc/XbimReferencedModel.cs index cd737fd92..dd0b5ad52 100644 --- a/Xbim.Ifc/XbimReferencedModel.cs +++ b/Xbim.Ifc/XbimReferencedModel.cs @@ -29,7 +29,12 @@ public ITransaction DocumentInfoTransaction } } - public XbimReferencedModel(IIfcDocumentInformation documentInformation) + public XbimReferencedModel(IIfcDocumentInformation documentInformation) : this(documentInformation, "") + { + + } + + public XbimReferencedModel(IIfcDocumentInformation documentInformation, string rootModelPath) { DocumentInformation = documentInformation; @@ -45,6 +50,11 @@ public XbimReferencedModel(IIfcDocumentInformation documentInformation) var fi = new FileInfo(referencingStore.FileName); searchPaths.Add(fi.DirectoryName); } + if(!string.IsNullOrEmpty(rootModelPath)) + { + var fi = new FileInfo(rootModelPath); + searchPaths.Add(fi.DirectoryName); + } var headerFileName = documentInformation.Model?.Header?.FileName?.Name; if (Path.IsPathRooted(headerFileName)) { From bb3c80e580fd18ec5a6a2ab87311318572d77eef Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Wed, 26 Mar 2025 17:31:47 +0000 Subject: [PATCH 14/16] Re-use IfcApplications, IfcOrganisations/Persons when adding /editing models across sessions to avoid duplicating. #608 Minor refactoring to use EntityCreator for cross schema consistency Attempt to follow OwnerHistory intent more closely (Owner vs Modification). --- Tests/IfcStoreTests.cs | 115 +++++++++++- Xbim.Ifc/IfcStore.cs | 299 ++++++++++++------------------ Xbim.Ifc/XbimEditorCredentials.cs | 38 +++- 3 files changed, 266 insertions(+), 186 deletions(-) diff --git a/Tests/IfcStoreTests.cs b/Tests/IfcStoreTests.cs index 691bddef7..88452a2c3 100644 --- a/Tests/IfcStoreTests.cs +++ b/Tests/IfcStoreTests.cs @@ -1,8 +1,13 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using FluentAssertions; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; using System.Linq; -using Xbim.Ifc4.Interfaces; +using Xbim.Ifc; using Xbim.Ifc2x3.SharedBldgElements; +using Xbim.Ifc4.Interfaces; using Xbim.IO.Esent; +using Xbim.IO.Step21; namespace Xbim.Essentials.Tests { @@ -23,16 +28,114 @@ public void UseEsentModelProvider_DifferentCounts_ShouldBeConsistent() var countInsideTransactionBeforeNewWall = model.Instances.CountOf(); var newWall = model.Instances.New(); countInsideTransactionAfterNewWall = model.Instances.CountOf(); - - Assert.AreEqual(countInsideTransactionBeforeNewWall + 1, countInsideTransactionAfterNewWall, "Count after creation should be count before creation + 1."); + countInsideTransactionAfterNewWall.Should().Be(countInsideTransactionBeforeNewWall + 1, "Adding wall adds one"); t.Commit(); } var countOfAfterCommiting = model.Instances.CountOf(); var ofTypeCountAfterCommiting = model.Instances.OfType().LongCount(); - Assert.AreEqual(countOfAfterCommiting, countInsideTransactionAfterNewWall, "Count after creation should be count after commiting using CountOf."); - Assert.AreEqual(countOfAfterCommiting, ofTypeCountAfterCommiting, "Count after creation should be count after commiting counting the result of OfType."); + countOfAfterCommiting.Should().Be(countInsideTransactionAfterNewWall); + countOfAfterCommiting.Should().Be(ofTypeCountAfterCommiting); + } + + + [TestMethod] + public void AddingUpdatingElementsAddsApplicationOnce() + { + var updatedFile = "4walls1floorSiteDoorAmended.ifc"; + long count; + List origLabels; + XbimEditorCredentials editor = CreateEditor(); + using (var ifcStore = IfcStore.Open("TestFiles\\4walls1floorSite.ifc", editor)) + { + count = ifcStore.Instances.Count; + origLabels = ifcStore.Instances.Select(x => x.EntityLabel).ToList(); + AddProduct("Door1", ifcStore); + DumpNewItems("first run", ifcStore, origLabels); + + var diffCount = ifcStore.Instances.Count - count; + diffCount.Should().Be(8); // Door + Application, OwnerHistory, Org * 2, Person, PersonOrg + + ifcStore.SaveAs(updatedFile); + ifcStore.Close(); + } + using (var ifcStore = IfcStore.Open(updatedFile, editor)) + { + count = ifcStore.Instances.Count; + origLabels = ifcStore.Instances.Select(x => x.EntityLabel).ToList(); + AddProduct("Door2", ifcStore); + var toEdit = ifcStore.Instances.OfType().First(); + var originator = toEdit.OwnerHistory; + EditProduct(toEdit, "Wall 3", ifcStore); + DumpNewItems("added second run", ifcStore, origLabels); + + var diffCount = ifcStore.Instances.Count - count; + diffCount.Should().Be(3, "Only the door and 2 x OwnerHistory is created. Application, Person etc re-used"); + + DumpItems("affected items", ifcStore, new[] { toEdit.EntityLabel, originator.EntityLabel }); + } + + } + + + + private XbimEditorCredentials CreateEditor() + { + return new XbimEditorCredentials + { + ApplicationFullName = "Xbim Essentials Unit tests", + ApplicationIdentifier = "xbim-tests-1.0", + ApplicationDevelopersName = "xbim Team", + ApplicationVersion = "6.0.0", + + EditorsIdentifier = "end.user@acme.com", + EditorsFamilyName = "End", + EditorsGivenName = "User", + EditorsOrganisationIdentifier = "org.acme", + EditorsOrganisationName = "Acme Inc" + }; + } + + private void DumpNewItems(string message, IfcStore ifcStore, IEnumerable origLabels) + { + var newLabels = ifcStore.Instances.Select(x => x.EntityLabel).ToList(); + var newLabelList = newLabels.Except(origLabels); + Console.WriteLine(message); + foreach (var item in newLabelList) + { + Console.WriteLine(ifcStore.Instances[item].ToString()); + } + } + + private void DumpItems(string message, IfcStore ifcStore, IEnumerable items) + { + Console.WriteLine(message); + foreach (var item in items) + { + Console.WriteLine(ifcStore.Instances[item].ToString()); + } + } + + private static void AddProduct(string productName, IfcStore ifcStore) + { + using (var txn = ifcStore.BeginTransaction("Adding")) + { + var door = ifcStore.Instances.New(); + door.Name = productName; + door.GlobalId = Guid.NewGuid().ToPart21(); + txn.Commit(); + } + } + + private void EditProduct(T element, string newName, IfcStore ifcStore) where T: IIfcRoot + { + using (var txn = ifcStore.BeginTransaction("Adding")) + { + element.Name = newName + " Updated"; + element.Description = "Edited"; + txn.Commit(); + } } } } diff --git a/Xbim.Ifc/IfcStore.cs b/Xbim.Ifc/IfcStore.cs index ff2ee9fb7..285e9b8e6 100644 --- a/Xbim.Ifc/IfcStore.cs +++ b/Xbim.Ifc/IfcStore.cs @@ -524,11 +524,24 @@ private void IfcRootModified(IPersistEntity entity, int property) if (root.OwnerHistory != _ownerHistoryModifyObject) { + var originalHistory = root.OwnerHistory; + MergeOwnerHistory(originalHistory); + root.OwnerHistory = OwnerHistoryModifyObject; - OwnerHistoryModifyObject.LastModifiedDate = DateTime.Now; + OwnerHistoryModifyObject.LastModifiedDate = DateTime.UtcNow; } } + private void MergeOwnerHistory(IIfcOwnerHistory originalHistory) + { + // This is naive. We have a store-wide OwnerHistory for modifications when really we + // should clone one from the original history, and apply to those items we edit. + // OwnerHistory is not really fit for purpose + OwnerHistoryModifyObject.CreationDate = originalHistory.CreationDate; + OwnerHistoryModifyObject.OwningApplication = originalHistory.OwningApplication; + OwnerHistoryModifyObject.OwningUser = originalHistory.OwningUser; + } + private void IfcRootInit(IPersistEntity entity) { if (!ManageOwnerHistory) @@ -538,7 +551,9 @@ private void IfcRootInit(IPersistEntity entity) { root.OwnerHistory = OwnerHistoryAddObject; root.GlobalId = Guid.NewGuid().ToPart21(); - OwnerHistoryAddObject.LastModifiedDate = DateTime.Now; + OwnerHistoryAddObject.LastModifiedDate = DateTime.UtcNow; + if(OwnerHistoryAddObject.CreationDate.Value == null) + OwnerHistoryAddObject.CreationDate = DateTime.UtcNow; } } @@ -556,51 +571,39 @@ public IIfcPersonAndOrganization DefaultOwningUser if (EditorDetails == null) return null; - if (SchemaVersion == XbimSchemaVersion.Ifc4 || SchemaVersion == XbimSchemaVersion.Ifc4x1) - { - var person = Instances.New(p => - { - p.GivenName = EditorDetails.EditorsGivenName; - p.FamilyName = EditorDetails.EditorsFamilyName; - }); - var organization = Instances.OfType().FirstOrDefault(o => o.Name == EditorDetails.EditorsOrganisationName) - ?? Instances.New(o => o.Name = EditorDetails.EditorsOrganisationName); - _defaultOwningUser = Instances.New(po => - { - po.TheOrganization = organization; - po.ThePerson = person; - }); - } - else if (SchemaVersion == XbimSchemaVersion.Ifc4x3) - { - var person = Instances.New(p => + var factory = new EntityCreator(this); + + var person = Instances.OfType() + .FirstOrDefault(p => // Look up by identifier and then Given/Family name + EditorDetails.EditorsIdentifier != null && p.Identification == EditorDetails.EditorsIdentifier || + (p.GivenName == EditorDetails.EditorsGivenName && p.FamilyName == EditorDetails.EditorsFamilyName)) + ?? factory.Person(p => { + p.Identification = EditorDetails.EditorsIdentifier; p.GivenName = EditorDetails.EditorsGivenName; p.FamilyName = EditorDetails.EditorsFamilyName; }); - var organization = Instances.OfType().FirstOrDefault(o => o.Name == EditorDetails.EditorsOrganisationName) - ?? Instances.New(o => o.Name = EditorDetails.EditorsOrganisationName); - _defaultOwningUser = Instances.New(po => - { - po.TheOrganization = organization; - po.ThePerson = person; - }); - } - else - { - var person = Instances.New(p => + + var organization = Instances.OfType() + .FirstOrDefault(o => // Look up by identifier and then Organisation name + EditorDetails.EditorsOrganisationIdentifier != null && o.Identification == EditorDetails.EditorsOrganisationIdentifier || + (o.Name == EditorDetails.EditorsOrganisationName)) + ?? factory.Organization(o => { - p.GivenName = EditorDetails.EditorsGivenName; - p.FamilyName = EditorDetails.EditorsFamilyName; + o.Name = EditorDetails.EditorsOrganisationName; + o.Identification = EditorDetails.EditorsOrganisationIdentifier; }); - var organization = Instances.OfType().FirstOrDefault(o => o.Name == EditorDetails.EditorsOrganisationName) - ?? Instances.New(o => o.Name = EditorDetails.EditorsOrganisationName); - _defaultOwningUser = Instances.New(po => + + _defaultOwningUser = + Instances.OfType() + .FirstOrDefault(po => po.ThePerson == person && po.TheOrganization == organization) + ?? factory.PersonAndOrganization(po => { po.TheOrganization = organization; po.ThePerson = person; }); - } + + return _defaultOwningUser; } } @@ -619,41 +622,38 @@ public IIfcApplication DefaultOwningApplication if (EditorDetails == null) return null; - if (SchemaVersion == XbimSchemaVersion.Ifc4 || SchemaVersion == XbimSchemaVersion.Ifc4x1) - return _defaultOwningApplication ?? - (_defaultOwningApplication = - Instances.New(a => - { - a.ApplicationDeveloper = Instances.OfType().FirstOrDefault(o => o.Name == EditorDetails.ApplicationDevelopersName) - ?? Instances.New(o => o.Name = EditorDetails.ApplicationDevelopersName); - a.ApplicationFullName = EditorDetails.ApplicationFullName; - a.ApplicationIdentifier = EditorDetails.ApplicationIdentifier; - a.Version = EditorDetails.ApplicationVersion; - } - )); - else if (SchemaVersion == XbimSchemaVersion.Ifc4x3) - return _defaultOwningApplication ?? - (_defaultOwningApplication = - Instances.New(a => - { - a.ApplicationDeveloper = Instances.OfType().FirstOrDefault(o => o.Name == EditorDetails.EditorsOrganisationName) - ?? Instances.New(o => o.Name = EditorDetails.EditorsOrganisationName); - a.ApplicationFullName = EditorDetails.ApplicationFullName; - a.ApplicationIdentifier = EditorDetails.ApplicationIdentifier; - a.Version = EditorDetails.ApplicationVersion; - } - )); - return _defaultOwningApplication ?? - (_defaultOwningApplication = - Instances.New(a => + var existingApplication = Instances.OfType() + .Where(a => a.ApplicationFullName == EditorDetails.ApplicationFullName) + .Where(a => a.ApplicationIdentifier == EditorDetails.ApplicationIdentifier) + .Where(a => a.Version == EditorDetails.ApplicationVersion) + .FirstOrDefault(); + if(existingApplication != null) + { + // use existing to avoid duplicate applications + _defaultOwningApplication = existingApplication; + } + else + { + // Create new application + var factory = new EntityCreator(this); + _defaultOwningApplication = factory.Application(a => + { + a.ApplicationDeveloper = Instances.OfType().FirstOrDefault(o => o.Name == EditorDetails.ApplicationDevelopersName) + ?? factory.Organization(o => { - a.ApplicationDeveloper = Instances.OfType().FirstOrDefault(o => o.Name == EditorDetails.ApplicationDevelopersName) - ?? Instances.New(o => o.Name = EditorDetails.ApplicationDevelopersName); - a.ApplicationFullName = EditorDetails.ApplicationFullName; - a.ApplicationIdentifier = EditorDetails.ApplicationIdentifier; - a.Version = EditorDetails.ApplicationVersion; - } - )); + o.Name = EditorDetails.ApplicationDevelopersName; + o.Roles.Add(factory.ActorRole(r => + { + r.Role = IfcRoleEnum.USERDEFINED; + r.UserDefinedRole = "Software Provider"; + })); + }); + a.ApplicationFullName = EditorDetails.ApplicationFullName; + a.ApplicationIdentifier = EditorDetails.ApplicationIdentifier; + a.Version = EditorDetails.ApplicationVersion; + }); + } + return _defaultOwningApplication; } } @@ -663,30 +663,16 @@ public IIfcOwnerHistory OwnerHistoryAddObject { if (_ownerHistoryAddObject != null) return _ownerHistoryAddObject; - if (SchemaVersion == XbimSchemaVersion.Ifc4 || SchemaVersion == XbimSchemaVersion.Ifc4x1) + var factory = new EntityCreator(this); + _ownerHistoryAddObject = factory.OwnerHistory(owner => { - var histAdd = Instances.New(); - histAdd.OwningUser = (Ifc4.ActorResource.IfcPersonAndOrganization)DefaultOwningUser; - histAdd.OwningApplication = (Ifc4.UtilityResource.IfcApplication)DefaultOwningApplication; - histAdd.ChangeAction = IfcChangeActionEnum.ADDED; - _ownerHistoryAddObject = histAdd; - } - else if (SchemaVersion == XbimSchemaVersion.Ifc4x3) - { - var histAdd = Instances.New(); - histAdd.OwningUser = (Ifc4x3.ActorResource.IfcPersonAndOrganization)DefaultOwningUser; - histAdd.OwningApplication = (Ifc4x3.UtilityResource.IfcApplication)DefaultOwningApplication; - histAdd.ChangeAction = Ifc4x3.UtilityResource.IfcChangeActionEnum.ADDED; - _ownerHistoryAddObject = histAdd; - } - else - { - var histAdd = Instances.New(); - histAdd.OwningUser = (Ifc2x3.ActorResource.IfcPersonAndOrganization)DefaultOwningUser; - histAdd.OwningApplication = (Ifc2x3.UtilityResource.IfcApplication)DefaultOwningApplication; - histAdd.ChangeAction = Ifc2x3.UtilityResource.IfcChangeActionEnum.ADDED; - _ownerHistoryAddObject = histAdd; - } + owner.OwningUser = DefaultOwningUser; + owner.OwningApplication = DefaultOwningApplication; + owner.ChangeAction = IfcChangeActionEnum.ADDED; + owner.LastModifyingUser = DefaultOwningUser; + owner.LastModifyingApplication = DefaultOwningApplication; + + }); return _ownerHistoryAddObject; } } @@ -697,30 +683,18 @@ internal IIfcOwnerHistory OwnerHistoryModifyObject { if (_ownerHistoryModifyObject != null) return _ownerHistoryModifyObject; - if (SchemaVersion == XbimSchemaVersion.Ifc4 || SchemaVersion == XbimSchemaVersion.Ifc4x1) - { - var histmod = Instances.New(); - histmod.OwningUser = (Ifc4.ActorResource.IfcPersonAndOrganization)DefaultOwningUser; - histmod.OwningApplication = (Ifc4.UtilityResource.IfcApplication)DefaultOwningApplication; - histmod.ChangeAction = IfcChangeActionEnum.MODIFIED; - _ownerHistoryModifyObject = histmod; - } - else if (SchemaVersion == XbimSchemaVersion.Ifc4x3) - { - var histmod = Instances.New(); - histmod.OwningUser = (Ifc4x3.ActorResource.IfcPersonAndOrganization)DefaultOwningUser; - histmod.OwningApplication = (Ifc4x3.UtilityResource.IfcApplication)DefaultOwningApplication; - histmod.ChangeAction = Ifc4x3.UtilityResource.IfcChangeActionEnum.MODIFIED; - _ownerHistoryModifyObject = histmod; - } - else + + var factory = new EntityCreator(this); + _ownerHistoryModifyObject = factory.OwnerHistory(owner => { - var histmod = Instances.New(); - histmod.OwningUser = (Ifc2x3.ActorResource.IfcPersonAndOrganization)DefaultOwningUser; - histmod.OwningApplication = (Ifc2x3.UtilityResource.IfcApplication)DefaultOwningApplication; - histmod.ChangeAction = Ifc2x3.UtilityResource.IfcChangeActionEnum.MODIFIED; - _ownerHistoryModifyObject = histmod; - } + owner.OwningUser = DefaultOwningUser; + owner.OwningApplication = DefaultOwningApplication; + + owner.ChangeAction = IfcChangeActionEnum.MODIFIED; + owner.LastModifyingUser = DefaultOwningUser; + owner.LastModifyingApplication = DefaultOwningApplication; + }); + return _ownerHistoryModifyObject; } } @@ -837,26 +811,22 @@ public XbimReferencedModel AddModelReference(string refModelPath, string organis XbimReferencedModel retVal; using (var txn = BeginTransaction()) { - if (SchemaVersion == XbimSchemaVersion.Ifc4 || SchemaVersion == XbimSchemaVersion.Ifc4x1) + var factory = new EntityCreator(this); + // TODO: should look up an existing matching role/organisatuon + var role = factory.ActorRole(r => { - var role = Instances.New(); - role.RoleString = organisationRole; - // the string is converted appropriately by the IfcActorRoleClass - var org = Instances.New(); - org.Name = organisationName; - org.Roles.Add(role); - retVal = AddModelReference(refModelPath, org); - } - else + r.Role = IfcRoleEnum.USERDEFINED; + r.UserDefinedRole = organisationRole; + }); + // the string is converted appropriately by the IfcActorRoleClass + + var org = factory.Organization(org => { - var role = Instances.New(); - role.RoleString = organisationRole; - // the string is converted appropriately by the IfcActorRoleClass - var org = Instances.New(); org.Name = organisationName; org.Roles.Add(role); - retVal = AddModelReference(refModelPath, org); - } + }); + retVal = AddModelReference(refModelPath, org); + txn.Commit(); } return retVal; @@ -868,18 +838,21 @@ public XbimReferencedModel AddModelReference(string refModelPath, string organis /// the file path of the xbim model to reference, this must be an xbim file /// the actor who supplied the model /// - private XbimReferencedModel AddModelReference(string refModelPath, Ifc2x3.ActorResource.IfcOrganization owner) + private XbimReferencedModel AddModelReference(string refModelPath, IIfcOrganization owner) { XbimReferencedModel retVal; + var factory = new EntityCreator(this); if (CurrentTransaction == null) { using (var txn = BeginTransaction()) { - var docInfo = Instances.New(); - docInfo.DocumentId = new Ifc2x3.MeasureResource.IfcIdentifier(_referencedModels.NextIdentifer()); - docInfo.Name = refModelPath; - docInfo.DocumentOwner = owner; - docInfo.IntendedUse = RefDocument; + var docInfo = factory.DocumentInformation(d => + { + d.Identification = new IfcIdentifier(_referencedModels.NextIdentifer()); + d.Name = refModelPath; + d.DocumentOwner = owner; + d.IntendedUse = RefDocument; + }); retVal = new XbimReferencedModel(docInfo); AddModelReference(retVal); txn.Commit(); @@ -887,53 +860,21 @@ private XbimReferencedModel AddModelReference(string refModelPath, Ifc2x3.ActorR } else { - var docInfo = Instances.New(); - docInfo.DocumentId = new Ifc2x3.MeasureResource.IfcIdentifier(_referencedModels.NextIdentifer()); - docInfo.Name = refModelPath; - docInfo.DocumentOwner = owner; - docInfo.IntendedUse = RefDocument; - retVal = new XbimReferencedModel(docInfo); - AddModelReference(retVal); - } - return retVal; - } - - /// - /// adds a model as a reference model can be called inside a transaction - /// - /// the file path of the xbim model to reference, this must be an xbim file - /// the actor who supplied the model - /// - private XbimReferencedModel AddModelReference(string refModelPath, Ifc4.ActorResource.IfcOrganization owner) - { - XbimReferencedModel retVal; - if (CurrentTransaction == null) - { - using (var txn = BeginTransaction()) + var docInfo = factory.DocumentInformation(d => { - var docInfo = Instances.New(); - docInfo.Identification = new IfcIdentifier(_referencedModels.NextIdentifer()); - docInfo.Name = refModelPath; - docInfo.DocumentOwner = owner; - docInfo.IntendedUse = RefDocument; - retVal = new XbimReferencedModel(docInfo); - AddModelReference(retVal); - txn.Commit(); - } - } - else - { - var docInfo = Instances.New(); - docInfo.Identification = new IfcIdentifier(_referencedModels.NextIdentifer()); - docInfo.Name = refModelPath; - docInfo.DocumentOwner = owner; - docInfo.IntendedUse = RefDocument; + d.Identification = new IfcIdentifier(_referencedModels.NextIdentifer()); + d.Name = refModelPath; + d.DocumentOwner = owner; + d.IntendedUse = RefDocument; + }); retVal = new XbimReferencedModel(docInfo); AddModelReference(retVal); } return retVal; } + + /// /// All reference models are opened in a readonly mode. /// Their children reference models is invoked iteratively. diff --git a/Xbim.Ifc/XbimEditorCredentials.cs b/Xbim.Ifc/XbimEditorCredentials.cs index 05a74d959..53ac6661d 100644 --- a/Xbim.Ifc/XbimEditorCredentials.cs +++ b/Xbim.Ifc/XbimEditorCredentials.cs @@ -1,13 +1,49 @@ -namespace Xbim.Ifc +using Xbim.Ifc4.Interfaces; + +namespace Xbim.Ifc { + /// + /// Defines baseline details of any user and application used to make changes to a model. + /// + /// Used to build the linked to an additions or modifications + /// made on a model public class XbimEditorCredentials { + /// + /// The unique Identifier of the end user - e.g. email address or UUID + /// + public string EditorsIdentifier; + /// + /// The family name of the end user + /// public string EditorsFamilyName; + /// + /// The given name of the end user + /// public string EditorsGivenName; + /// + /// The name of the organisation the editor belongs to + /// public string EditorsOrganisationName; + /// + /// Identification of the organization - e.g. an Org code or UUID + /// + public string EditorsOrganisationIdentifier; + /// + /// The full name of the application as specified by the application developer. + /// public string ApplicationFullName; + /// + /// The version number of this software as specified by the developer of the application. + /// public string ApplicationVersion; + /// + /// A short identifying name for the application + /// public string ApplicationIdentifier; + /// + /// The name of the organisation responsible for the IFC authoring tool + /// public string ApplicationDevelopersName; } } From 46fd49b26509455c9694de717e208089963f14ba Mon Sep 17 00:00:00 2001 From: Han Date: Mon, 17 Apr 2023 23:59:18 +0800 Subject: [PATCH 15/16] OptionalIfcLogicalTest for issue #502 --- Tests/OptionalIfcLogicalTest.cs | 34 ++++++++++++ Tests/TestFiles/IfcMaterialLayerTestFile.ifc | 54 ++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 Tests/OptionalIfcLogicalTest.cs create mode 100644 Tests/TestFiles/IfcMaterialLayerTestFile.ifc diff --git a/Tests/OptionalIfcLogicalTest.cs b/Tests/OptionalIfcLogicalTest.cs new file mode 100644 index 000000000..c99ff88bd --- /dev/null +++ b/Tests/OptionalIfcLogicalTest.cs @@ -0,0 +1,34 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xbim.Ifc2x3.MeasureResource; +using Xbim.Ifc4.Interfaces; +using Xbim.IO.Memory; + +namespace Xbim.Essentials.Tests +{ + /// + /// For failing on IfcMaterialLayer.IsVentilated : OPTIONAL IfcLogical + /// + [TestClass] + public class OptionalIfcLogicalTest + { + [TestMethod] + public void IfcMaterialLayerTest() + { + var ifcPath = "TestFiles/IfcMaterialLayerTestFile.ifc"; + using(MemoryModel model = MemoryModel.OpenReadStep21(ifcPath)) + { + var entity = model.Instances[347] as IIfcMaterialLayer; + Assert.IsNotNull(entity); + Assert.IsNotNull(entity.IsVentilated); + Assert.Equals(entity.IsVentilated.ToString(), ".U."); + Assert.Equals(entity.ToString(), + "#347=IFCMATERIALLAYER(#326,417.,.U.,'Component 1',$,$,$);"); + } + } + } +} diff --git a/Tests/TestFiles/IfcMaterialLayerTestFile.ifc b/Tests/TestFiles/IfcMaterialLayerTestFile.ifc new file mode 100644 index 000000000..9841b6082 --- /dev/null +++ b/Tests/TestFiles/IfcMaterialLayerTestFile.ifc @@ -0,0 +1,54 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('ViewDefinition [Design_Transfer_View]'),'2;1'); +FILE_NAME('./Duplex_A_ifc4.ifc','2019-05-07T17:09:22',('Architect'),('Building Designer Office'),'The EXPRESS Data Manager Version 5.02.0100.09 : 26 Sep 2013','IFC file generated by GRAPHISOFT ARCHICAD-64 22.0.0.','The authorising person'); +FILE_SCHEMA(('IFC4')); +ENDSEC; +DATA; +#85= IFCDIRECTION((1.,0.,0.)); +#87= IFCDIRECTION((0.,0.,1.)); +#89= IFCCARTESIANPOINT((0.,0.,0.)); +#91= IFCAXIS2PLACEMENT3D(#89,#87,#85); +#92= IFCLOCALPLACEMENT($,#91); +#113= IFCDIRECTION((1.,0.,0.)); +#115= IFCDIRECTION((0.,0.,1.)); +#117= IFCCARTESIANPOINT((0.,0.,0.)); +#119= IFCAXIS2PLACEMENT3D(#117,#115,#113); +#120= IFCLOCALPLACEMENT(#92,#119); +#169= IFCDIRECTION((1.,0.,0.)); +#171= IFCDIRECTION((0.,0.,1.)); +#173= IFCCARTESIANPOINT((0.,0.,-1250.)); +#175= IFCAXIS2PLACEMENT3D(#173,#171,#169); +#176= IFCLOCALPLACEMENT(#120,#175); +#237= IFCDIRECTION((1.,0.,0.)); +#239= IFCDIRECTION((0.,0.,1.)); +#241= IFCCARTESIANPOINT((208.5,-208.5,0.)); +#243= IFCAXIS2PLACEMENT3D(#241,#239,#237); +#244= IFCLOCALPLACEMENT(#176,#243); +#248= IFCCARTESIANPOINT((208.5,-208.5)); +#250= IFCCARTESIANPOINT((8174.5,-208.5)); +#252= IFCCARTESIANPOINT((8591.5,208.5)); +#254= IFCCARTESIANPOINT((-208.5,208.5)); +#256= IFCPOLYLINE((#248,#250,#252,#254,#248)); +#258= IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'',#256); +#261= IFCDIRECTION((1.,0.,0.)); +#263= IFCDIRECTION((0.,0.,1.)); +#265= IFCCARTESIANPOINT((0.,0.,0.)); +#267= IFCAXIS2PLACEMENT3D(#265,#263,#261); +#268= IFCDIRECTION((0.,0.,1.)); +#270= IFCEXTRUDEDAREASOLID(#258,#267,#268,1250.); +#280= IFCSHAPEREPRESENTATION(#246,'Body','SweptSolid',(#270)); +#287= IFCPRESENTATIONLAYERASSIGNMENT('A-WALL-MBNI.IFC Model',$,(#280,#297),$); +#297= IFCSHAPEREPRESENTATION(#290,'Axis','Curve2D',(#295)); +#291= IFCCARTESIANPOINT((0.,0.)); +#293= IFCCARTESIANPOINT((8383.,0.)); +#295= IFCPOLYLINE((#291,#293)); +#301= IFCPRODUCTDEFINITIONSHAPE($,$,(#280,#297)); +#307= IFCWALLSTANDARDCASE('2O2Fr$t4X7Zf8NOew3FK80',$,'Basic Wall:Foundation - Concrete (417mm):140479',$,'Basic Wall:Foundation - Concrete (417mm):128676',#244,#301,'140479',$); +#326= IFCMATERIAL('Concrete - Cast In Situ',$,$); +#347= IFCMATERIALLAYER(#326,417.,.U.,'Component 1',$,$,$); +#349= IFCMATERIALLAYERSET((#347),'Concrete - Cast In Situ 417',$); +#352= IFCMATERIALLAYERSETUSAGE(#349,.AXIS2.,.POSITIVE.,-208.5,$); +#354 = IFCRELASSOCIATESMATERIAL('3nhziuMrHzR_A3$qPzE8R4',$,$,$,(#307),#352); +ENDSEC; +END-ISO-10303-21; From 81450e33180c7daa61ebabf2ceeb8a862a2f2e19 Mon Sep 17 00:00:00 2001 From: Andy Ward Date: Fri, 28 Mar 2025 15:10:01 +0000 Subject: [PATCH 16/16] Updated to latest develop and expanded the tests to show the issue --- Tests/OptionalIfcLogicalTest.cs | 102 ++++++++++++++++--- Tests/TestFiles/IfcMaterialLayerTestFile.ifc | 8 +- 2 files changed, 94 insertions(+), 16 deletions(-) diff --git a/Tests/OptionalIfcLogicalTest.cs b/Tests/OptionalIfcLogicalTest.cs index c99ff88bd..14e4acacd 100644 --- a/Tests/OptionalIfcLogicalTest.cs +++ b/Tests/OptionalIfcLogicalTest.cs @@ -1,10 +1,5 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xbim.Ifc2x3.MeasureResource; +using FluentAssertions; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Xbim.Ifc4.Interfaces; using Xbim.IO.Memory; @@ -16,18 +11,95 @@ namespace Xbim.Essentials.Tests [TestClass] public class OptionalIfcLogicalTest { + private const string ifcFile = "TestFiles/IfcMaterialLayerTestFile.ifc"; + [TestMethod] - public void IfcMaterialLayerTest() + public void UnknownOptionalLogicalShouldNotBeNull() { - var ifcPath = "TestFiles/IfcMaterialLayerTestFile.ifc"; - using(MemoryModel model = MemoryModel.OpenReadStep21(ifcPath)) + + using(MemoryModel model = MemoryModel.OpenReadStep21(ifcFile)) { var entity = model.Instances[347] as IIfcMaterialLayer; - Assert.IsNotNull(entity); - Assert.IsNotNull(entity.IsVentilated); - Assert.Equals(entity.IsVentilated.ToString(), ".U."); - Assert.Equals(entity.ToString(), - "#347=IFCMATERIALLAYER(#326,417.,.U.,'Component 1',$,$,$);"); + entity.Should().NotBeNull(); + // Spot Fix - what the parser should do + //using var tx = model.BeginTransaction(""); + //entity.IsVentilated = (bool?)null; + // + entity.IsVentilated.Should().NotBeNull(); // Fails as we treat .U. as $ rather than as IfcLogical with value unknown. + entity.IsVentilated.HasValue.Should().BeTrue(); + entity.IsVentilated.Value.Value.Should().BeNull(); + entity.IsVentilated.ToString().Should().Be("unknown"); + entity.IsVentilated.Value.Should().Be(new Ifc4.MeasureResource.IfcLogical()); + entity.ToString().Should().Be("#347=IFCMATERIALLAYER(#326,417.,.U.,'Component 1',$,$,$);"); + } + } + + [TestMethod] + public void TrueOptionalLogicalShouldBeTrue() + { + + using (MemoryModel model = MemoryModel.OpenReadStep21(ifcFile)) + { + var element = 502; + var entity = model.Instances[element] as IIfcMaterialLayer; + entity.Should().NotBeNull(); + entity.IsVentilated.HasValue.Should().BeTrue(); + entity.IsVentilated.Value.Value.Should().BeOfType().And.Be(true); + entity.IsVentilated.ToString().Should().Be("true"); + entity.IsVentilated.Value.Should().Be(new Ifc4.MeasureResource.IfcLogical(true)); + entity.ToString().Should().Be($"#{element}=IFCMATERIALLAYER(#326,417.,.T.,'Component 1',$,$,$);"); + } + } + + [TestMethod] + public void FalseOptionalLogicalShouldBeFalse() + { + + using (MemoryModel model = MemoryModel.OpenReadStep21(ifcFile)) + { + var element = 503; + var entity = model.Instances[element] as IIfcMaterialLayer; + entity.Should().NotBeNull(); + entity.IsVentilated.HasValue.Should().BeTrue(); + entity.IsVentilated.Value.Value.Should().BeOfType().And.Be(false); + entity.IsVentilated.ToString().Should().Be("false"); + entity.IsVentilated.Value.Should().Be(new Ifc4.MeasureResource.IfcLogical(false)); + entity.ToString().Should().Be($"#{element}=IFCMATERIALLAYER(#326,417.,.F.,'Component 1',$,$,$);"); + } + } + + [TestMethod] + public void TrueBooleanShouldBeTrue() + { + + using (MemoryModel model = MemoryModel.OpenReadStep21(ifcFile)) + { + var element = 500; + var entity = model.Instances[element] as IIfcPropertySingleValue; + entity.Should().NotBeNull(); + + entity.NominalValue.Value.Should().BeOfType().And.Be(true); + entity.NominalValue.ToString().Should().Be("true"); + entity.NominalValue.Should().Be(new Ifc4.MeasureResource.IfcBoolean(true)); + entity.ToString().Should().Be($"#{element}=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$);"); + entity.NominalValue.Equals(true).Should().BeFalse("not implicitly cast"); + } + } + + [TestMethod] + public void FalseBooleanShouldBeFalse() + { + + using (MemoryModel model = MemoryModel.OpenReadStep21(ifcFile)) + { + var element = 501; + var entity = model.Instances[element] as IIfcPropertySingleValue; + entity.Should().NotBeNull(); + + entity.NominalValue.Value.Should().BeOfType().And.Be(false); + entity.NominalValue.Should().Be(new Ifc4.MeasureResource.IfcBoolean(false)); + entity.ToString().Should().Be($"#{element}=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$);"); + entity.NominalValue.Equals(false).Should().BeFalse("not implicitly cast"); } } } diff --git a/Tests/TestFiles/IfcMaterialLayerTestFile.ifc b/Tests/TestFiles/IfcMaterialLayerTestFile.ifc index 9841b6082..b1dfd1080 100644 --- a/Tests/TestFiles/IfcMaterialLayerTestFile.ifc +++ b/Tests/TestFiles/IfcMaterialLayerTestFile.ifc @@ -49,6 +49,12 @@ DATA; #347= IFCMATERIALLAYER(#326,417.,.U.,'Component 1',$,$,$); #349= IFCMATERIALLAYERSET((#347),'Concrete - Cast In Situ 417',$); #352= IFCMATERIALLAYERSETUSAGE(#349,.AXIS2.,.POSITIVE.,-208.5,$); -#354 = IFCRELASSOCIATESMATERIAL('3nhziuMrHzR_A3$qPzE8R4',$,$,$,(#307),#352); +#354= IFCRELASSOCIATESMATERIAL('3nhziuMrHzR_A3$qPzE8R4',$,$,$,(#307),#352); + +#500=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$); +#501=IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$); +#502= IFCMATERIALLAYER(#326,417.,.T.,'Component 1',$,$,$); +#503= IFCMATERIALLAYER(#326,417.,.F.,'Component 1',$,$,$); + ENDSEC; END-ISO-10303-21;