private void AddQuantityPSet(IIfcElementQuantity pSet, IIfcUnitAssignment modelUnits)
 {
     if (pSet == null)
     {
         return;
     }
     if (modelUnits == null)
     {
         throw new ArgumentNullException(nameof(modelUnits));
     }
     foreach (var item in pSet.Quantities.OfType <IIfcPhysicalSimpleQuantity>())
     // currently only handles IfcPhysicalSimpleQuantity
     {
         _quantities.Add(new PropertyItem
         {
             PropertySetName = pSet.Name,
             Name            = item.Name,
             Value           = GetValueString(item, modelUnits)
         });
     }
 }
        public static void ResolveQuantitySet(IfcStore ifcStore)
        {
            Dictionary <IfcObject, List <IfcPropertySet> > qSetsByIfcObject = new Dictionary <IfcObject, List <IfcPropertySet> >();

            using (var txn = ifcStore.BeginTransaction("QuantitySet Creation Ifc2x3"))
            {
                List <IIfcRelDefinesByProperties> relProps = ifcStore.Instances.OfType <IIfcRelDefinesByProperties>()
                                                             .Where(relProp => relProp.RelatingPropertyDefinition.Name.ToString().Contains("BaseQuantities")).ToList();

                foreach (IIfcRelDefinesByProperties relProp in relProps)
                {
                    IEnumerable <IIfcRelDefinesByProperties> propertyDefinitionOf = relProp.RelatingPropertyDefinition.PropertyDefinitionOf;

                    foreach (IIfcRelDefinesByProperties relation in propertyDefinitionOf)
                    {
                        if (relation.RelatingPropertyDefinition is IIfcElementQuantity)
                        {
                            IIfcElementQuantity qset = (IIfcElementQuantity)relation.RelatingPropertyDefinition;

                            IfcPropertySet pset = ifcStore.Instances.New <IfcPropertySet>(pSet =>
                            {
                                pSet.Name = qset.Name.ToString().StartsWith("Qto_")
                                           ? "LIBAL_" + qset.Name.ToString()
                                       : "LIBAL_Qto_" + qset.Name.ToString();

                                Xbim.Common.IItemSet <IIfcPhysicalQuantity> quantities = qset.Quantities;
                                foreach (IIfcPhysicalQuantity quan in quantities)
                                {
                                    var value = resolveValue(quan);
                                    var unit  = resolveUnit(quan);
                                    var name  = quan.Name.ToString();

                                    if (value != null)
                                    {
                                        pSet.HasProperties.Add(ifcStore.Instances.New <IfcPropertySingleValue>(p =>
                                        {
                                            p.Name         = name;
                                            p.NominalValue = value;
                                            p.Unit         = unit;
                                        }));
                                    }
                                }
                            });

                            Xbim.Common.IItemSet <IIfcObject> relatedObjects = relation.RelatedObjects;

                            foreach (IfcObject ifcObject in relatedObjects)
                            {
                                if (!qSetsByIfcObject.ContainsKey(ifcObject))
                                {
                                    qSetsByIfcObject.Add(ifcObject, new List <IfcPropertySet>());
                                }

                                List <IfcPropertySet> psets = qSetsByIfcObject[ifcObject];
                                psets.Add(pset);
                            }
                        }
                    }
                }

                txn.Commit();
            }

            using (var txn = ifcStore.BeginTransaction("QuantitySet Reference Creation Ifc2x3"))
            {
                foreach (IfcObject key in qSetsByIfcObject.Keys)
                {
                    List <IfcPropertySet> psets = qSetsByIfcObject[key];

                    foreach (IfcPropertySet pset in psets)
                    {
                        var pSetRel = ifcStore.Instances.New <IfcRelDefinesByProperties>(r =>
                        {
                            r.RelatingPropertyDefinition = pset;
                        });
                        pSetRel.RelatedObjects.Add(key);
                    }
                }

                txn.Commit();
            }
        }