public static object GetSpecificValue(this IfcPhysicalSimpleQuantity Quantity) { if (Quantity is IfcQuantityLength) { return(((IfcQuantityLength)Quantity).LengthValue.Value); } else if (Quantity is IfcQuantityArea) { return(((IfcQuantityArea)Quantity).AreaValue.Value); } else if (Quantity is IfcQuantityVolume) { return(((IfcQuantityVolume)Quantity).VolumeValue.Value); } else if (Quantity is IfcQuantityCount) // really not sure what to do here. { return(((IfcQuantityCount)Quantity).CountValue.Value); } else if (Quantity is IfcQuantityWeight) { return(((IfcQuantityWeight)Quantity).WeightValue.Value); } else if (Quantity is IfcQuantityTime) { return(((IfcQuantityTime)Quantity).TimeValue.Value); } return(null); }
internal static void parseFields(IfcQuantityWeight q, List <string> arrFields, ref int ipos, ReleaseVersion schema) { IfcPhysicalSimpleQuantity.parseFields(q, arrFields, ref ipos); q.mWeightValue = ParserSTEP.ParseDouble(arrFields[ipos++]); if (schema != ReleaseVersion.IFC2x3) { q.mFormula = arrFields[ipos++].Replace("'", ""); } }
public static void SetElementPhysicalSimpleQuantity(this IfcObject elem, string qSetName, string qualityName, double value, XbimQuantityTypeEnum quantityType, IfcNamedUnit unit) { IModel model = elem.ModelOf; IfcElementQuantity qset = GetElementQuantity(elem, qSetName); if (qset == null) { qset = model.Instances.New <IfcElementQuantity>(); qset.Name = qSetName; IfcRelDefinesByProperties relDef = model.Instances.New <IfcRelDefinesByProperties>(); relDef.RelatingPropertyDefinition = qset; relDef.RelatedObjects.Add(elem); } //remove existing simple quality IfcPhysicalSimpleQuantity simpleQuality = GetElementPhysicalSimpleQuantity(elem, qSetName, qualityName); if (simpleQuality != null) { IfcElementQuantity elementQuality = GetElementQuantity(elem, qSetName); elementQuality.Quantities.Remove(simpleQuality); model.Delete(simpleQuality); } switch (quantityType) { case XbimQuantityTypeEnum.AREA: simpleQuality = model.Instances.New <IfcQuantityArea>(sq => sq.AreaValue = (IfcAreaMeasure)value); break; case XbimQuantityTypeEnum.COUNT: simpleQuality = model.Instances.New <IfcQuantityCount>(sq => sq.CountValue = (IfcCountMeasure)value); break; case XbimQuantityTypeEnum.LENGTH: simpleQuality = model.Instances.New <IfcQuantityLength>(sq => sq.LengthValue = (IfcLengthMeasure)value); break; case XbimQuantityTypeEnum.TIME: simpleQuality = model.Instances.New <IfcQuantityTime>(sq => sq.TimeValue = (IfcTimeMeasure)value); break; case XbimQuantityTypeEnum.VOLUME: simpleQuality = model.Instances.New <IfcQuantityVolume>(sq => sq.VolumeValue = (IfcVolumeMeasure)value); break; case XbimQuantityTypeEnum.WEIGHT: simpleQuality = model.Instances.New <IfcQuantityWeight>(sq => sq.WeightValue = (IfcMassMeasure)value); break; default: return; } simpleQuality.Unit = unit; simpleQuality.Name = qualityName; qset.Quantities.Add(simpleQuality); }
internal static void parseFields(IfcQuantityTime q, List <string> arrFields, ref int ipos, Schema schema) { IfcPhysicalSimpleQuantity.parseFields(q, arrFields, ref ipos); q.mTimeValue = int.Parse(arrFields[ipos++]); if (schema != Schema.IFC2x3) { q.mFormula = arrFields[ipos++].Replace("'", ""); } }
/// <summary> /// Returns the named unit for the specified quantity. /// /// EFFICIENCY WARNING: ***************** /// /// this requires a number of Database calls. In case you have to run queries on multiple IfcPhysicalSimpleQuantity it's far better /// to get the instance of IfcUnitAssignment from the model and use its GetUnitFor() method. /// </summary> /// <returns></returns> public static IfcNamedUnit GetResolvedUnit(this IfcPhysicalSimpleQuantity ifcPhysicalSimpleQuantity) { if (ifcPhysicalSimpleQuantity.Unit != null) { return(ifcPhysicalSimpleQuantity.Unit); } IfcUnitAssignment modelUnits = ifcPhysicalSimpleQuantity.ModelOf.Instances.OfType <IfcUnitAssignment>().FirstOrDefault(); // not optional, should never return void in valid model return(modelUnits.GetUnitFor(ifcPhysicalSimpleQuantity)); }
public static void RemoveElementPhysicalSimpleQuantity(this IfcObject elem, string pSetName, string qualityName) { IfcElementQuantity elementQuality = GetElementQuantity(elem, pSetName); if (elementQuality != null) { IfcPhysicalSimpleQuantity simpleQuality = elementQuality.Quantities.Where <IfcPhysicalSimpleQuantity>(sq => sq.Name == qualityName).FirstOrDefault(); if (simpleQuality != null) { elementQuality.Quantities.Remove(simpleQuality); } } }
public static IfcNamedUnit GetUnitFor(this IfcUnitAssignment ua, IfcPhysicalSimpleQuantity 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 // if (Quantity is IfcQuantityLength) { requiredUnit = IfcUnitEnum.LENGTHUNIT; } else if (Quantity is IfcQuantityArea) { requiredUnit = IfcUnitEnum.AREAUNIT; } else if (Quantity is IfcQuantityVolume) { requiredUnit = IfcUnitEnum.VOLUMEUNIT; } else if (Quantity is IfcQuantityCount) // really not sure what to do here. { return(null); } else if (Quantity is IfcQuantityWeight) { requiredUnit = IfcUnitEnum.MASSUNIT; } else if (Quantity is IfcQuantityTime) { requiredUnit = IfcUnitEnum.TIMEUNIT; } if (requiredUnit == null) { return(null); } IfcNamedUnit nu = ua.Units.OfType <IfcSIUnit>().FirstOrDefault(u => u.UnitType == (IfcUnitEnum)requiredUnit); if (nu == null) { nu = ua.Units.OfType <IfcConversionBasedUnit>().FirstOrDefault(u => u.UnitType == (IfcUnitEnum)requiredUnit); } return(nu); }
internal static void parseFields(IfcQuantityLength q, List <string> arrFields, ref int ipos, ReleaseVersion schema) { IfcPhysicalSimpleQuantity.parseFields(q, arrFields, ref ipos); string str = arrFields[ipos++]; if (!double.TryParse(str, out q.mLengthValue)) { if (str.StartsWith("IFCLENGTHMEASURE")) { str = str.Substring(17, str.Length - 18); double.TryParse(str, out q.mLengthValue); } } if (schema != ReleaseVersion.IFC2x3) { q.mFormula = arrFields[ipos++].Replace("'", ""); } }
internal static void parseFields(IfcQuantityArea q, List <string> arrFields, ref int ipos, ReleaseVersion schema) { IfcPhysicalSimpleQuantity.parseFields(q, arrFields, ref ipos); string str = arrFields[ipos++]; if (!double.TryParse(str, System.Globalization.NumberStyles.Any, ParserSTEP.NumberFormat, out q.mAreaValue)) { if (str.StartsWith("IFCAREAMEASURE")) { str = str.Substring(15, str.Length - 16); double.TryParse(str, out q.mAreaValue); } } if (schema != ReleaseVersion.IFC2x3) { q.mFormula = arrFields[ipos++].Replace("'", ""); } }
internal static void parseFields(IfcQuantityVolume q, List <string> arrFields, ref int ipos, ReleaseVersion schema) { IfcPhysicalSimpleQuantity.parseFields(q, arrFields, ref ipos); string str = arrFields[ipos++]; double vol; if (double.TryParse(str, out vol)) { q.mVolumeValue = vol; } else { IfcMeasureValue mv = ParserIfc.parseMeasureValue(str); if (mv != null) { q.mVolumeValue = mv.Measure; } } if (schema != ReleaseVersion.IFC2x3) { q.mFormula = arrFields[ipos++].Replace("'", ""); } }
public static void SetElementPhysicalSimpleQuantity(this IfcTypeObject elem, string qSetName, string qualityName, double value, XbimQuantityTypeEnum quantityType, IfcNamedUnit unit) { IModel model = null; if (elem is IPersistIfcEntity) { model = (elem as IPersistIfcEntity).ModelOf; } else { model = elem.ModelOf; } IfcElementQuantity qset = GetElementQuantity(elem, qSetName); if (qset == null) { qset = model.Instances.New <IfcElementQuantity>(); qset.Name = qSetName; if (elem.HasPropertySets == null) { elem.CreateHasPropertySets(); } elem.HasPropertySets.Add(qset); } //remove existing simple quality IfcPhysicalSimpleQuantity simpleQuality = GetElementPhysicalSimpleQuantity(elem, qSetName, qualityName); if (simpleQuality != null) { IfcElementQuantity elementQuality = GetElementQuantity(elem, qSetName); elementQuality.Quantities.Remove(simpleQuality); model.Delete(simpleQuality); } switch (quantityType) { case XbimQuantityTypeEnum.AREA: simpleQuality = model.Instances.New <IfcQuantityArea>(sq => sq.AreaValue = value); break; case XbimQuantityTypeEnum.COUNT: simpleQuality = model.Instances.New <IfcQuantityCount>(sq => sq.CountValue = value); break; case XbimQuantityTypeEnum.LENGTH: simpleQuality = model.Instances.New <IfcQuantityLength>(sq => sq.LengthValue = value); break; case XbimQuantityTypeEnum.TIME: simpleQuality = model.Instances.New <IfcQuantityTime>(sq => sq.TimeValue = value); break; case XbimQuantityTypeEnum.VOLUME: simpleQuality = model.Instances.New <IfcQuantityVolume>(sq => sq.VolumeValue = value); break; case XbimQuantityTypeEnum.WEIGHT: simpleQuality = model.Instances.New <IfcQuantityWeight>(sq => sq.WeightValue = value); break; default: return; } simpleQuality.Unit = unit; simpleQuality.Name = qualityName; qset.Quantities.Add(simpleQuality); }