Ejemplo n.º 1
0
        private static void FixEnumerationSelect(SchemaModel model, DomainStructure namespaces)
        {
            // predefined type is defined as a select between two enumerations. We implement selects as interfaces and enumerations
            // in C# can not implement interfaces
            var transportElement     = model.Get <EntityDefinition>(e => e.Name == "IfcTransportElement").First();
            var transportElementType = model.Get <EntityDefinition>(e => e.Name == "IfcTransportElementType").First();
            var predefinedType       = transportElement.Attributes.First(a => a.Name == "PredefinedType") as ExplicitAttribute;
            var typePredefinedType   = transportElementType.Attributes.First(a => a.Name == "PredefinedType") as ExplicitAttribute;

            var select = predefinedType.Domain as SelectType;
            var enums  = select.Selections.OfType <EnumerationType>().ToList();
            var ns     = namespaces.Domains.FirstOrDefault(d => d.Types.Any(t => t == enums[0].Name));

            var singleEnum = model.New <EnumerationType>(transportElement.ParentSchema, e => {
                e.Name            = "IfcTransportElementTypeEnum";
                e.PersistanceName = e.Name;
                e.TypeId          = model.LastTypeId + 1;
                e.Elements        = new List <ExpressId>(
                    enums.SelectMany(en => en.Elements).Distinct()
                    );
            });

            predefinedType.Domain     = singleEnum;
            typePredefinedType.Domain = singleEnum;
            ns.Types.Add(singleEnum.Name);

            // remove select and enumerations not used
            model.Remove(select);
            enums.ForEach(e => model.Remove(e));
        }