/// <summary> /// Create a quantity for a given element. /// </summary> /// <param name="doc">The document.</param> /// <param name="element">The element being created.</param> /// <param name="parameterMap">The parameters of the element. Cached for performance.</param> /// <param name="propertySetName">The name of the containing property set.</param> /// <param name="createdParameters">The names of the created parameters.</param> public override void Create(Document doc, Element element, IFCParameterSetByGroup parameterGroupMap, string propertySetName, ISet <string> createdParameters) { double doubleValueToUse = IFCUnit != null?IFCUnit.Convert(Value.AsDouble()) : Value.AsDouble(); Parameter existingParameter = null; string originalParameterName = Name + "(" + propertySetName + ")"; string parameterName = originalParameterName; if (!parameterGroupMap.TryFindParameter(parameterName, out existingParameter)) { int parameterNameCount = 2; while (createdParameters.Contains(parameterName)) { parameterName = originalParameterName + " " + parameterNameCount; parameterNameCount++; } if (parameterNameCount > 2) { Importer.TheLog.LogWarning(Id, "Renamed parameter: " + originalParameterName + " to: " + parameterName, false); } if (existingParameter == null) { UnitType unitType = UnitType.UT_Undefined; if (IFCUnit != null) { unitType = IFCUnit.UnitType; } else { unitType = IFCDataUtil.GetUnitTypeFromData(Value, UnitType.UT_Number); } bool created = IFCPropertySet.AddParameterDouble(doc, element, parameterName, unitType, doubleValueToUse, Id); if (created) { createdParameters.Add(parameterName); } return; } } bool setValue = true; switch (existingParameter.StorageType) { case StorageType.String: existingParameter.Set(doubleValueToUse.ToString()); break; case StorageType.Double: existingParameter.Set(doubleValueToUse); break; default: setValue = false; break; } if (!setValue) { Importer.TheLog.LogError(Id, "Couldn't create parameter: " + Name + " of storage type: " + existingParameter.StorageType.ToString(), false); } }
/// <summary> /// Create a quantity for a given element. /// </summary> /// <param name="doc">The document.</param> /// <param name="element">The element being created.</param> /// <param name="category">The element's category.</param> /// <param name="parameterMap">The parameters of the element. Cached for performance.</param> /// <param name="propertySetName">The name of the containing property set.</param> /// <param name="createdParameters">The names of the created parameters.</param> public override void Create(Document doc, Element element, Category category, IFCObjectDefinition objDef, IFCParameterSetByGroup parameterGroupMap, string propertySetName, ISet <string> createdParameters) { double baseValue = 0.0; IFCDataPrimitiveType type = Value.PrimitiveType; switch (type) { case IFCDataPrimitiveType.Double: baseValue = Value.AsDouble(); break; case IFCDataPrimitiveType.Integer: // This case isn't valid, but could happen when repairing a file Importer.TheLog.LogWarning(Id, "Unexpected integer parameter type, repairing.", false); baseValue = Value.AsInteger(); break; default: Importer.TheLog.LogError(Id, "Invalid parameter type: " + type.ToString() + " for IfcPhysicalSimpleQuantity", false); return; } double doubleValueToUse = Importer.TheProcessor.ScaleValues ? IFCUnit?.Convert(baseValue) ?? baseValue : baseValue; Parameter existingParameter = null; string originalParameterName = propertySetName + "." + Name; string parameterName = originalParameterName; if (!parameterGroupMap.TryFindParameter(parameterName, out existingParameter)) { int parameterNameCount = 2; while (createdParameters.Contains(parameterName)) { parameterName = originalParameterName + " " + parameterNameCount; parameterNameCount++; } if (parameterNameCount > 2) { Importer.TheLog.LogWarning(Id, "Renamed parameter: " + originalParameterName + " to: " + parameterName, false); } if (existingParameter == null) { ForgeTypeId specTypeId; ForgeTypeId unitsTypeId = null; if (IFCUnit != null) { specTypeId = IFCUnit.Spec; unitsTypeId = IFCUnit.Unit; } else { specTypeId = IFCDataUtil.GetUnitTypeFromData(Value, SpecTypeId.Number); } bool created = IFCPropertySet.AddParameterDouble(doc, element, category, objDef, parameterName, specTypeId, unitsTypeId, doubleValueToUse, Id); if (created) { createdParameters.Add(parameterName); } return; } } bool setValue = true; switch (existingParameter.StorageType) { case StorageType.String: existingParameter.Set(doubleValueToUse.ToString()); break; case StorageType.Double: existingParameter.Set(doubleValueToUse); break; default: setValue = false; break; } if (!setValue) { Importer.TheLog.LogError(Id, "Couldn't create parameter: " + Name + " of storage type: " + existingParameter.StorageType.ToString(), false); } }