private Dictionary <string, ParameterInfo> ConvertProperties(IEnumerable <CADProperty> properties) { using (var monitoredExecutionBlock = monitoredExecutionContext .MonitorMethod <RevitHost>(nameof(ConvertProperties)) .WithParameter(nameof(properties), properties) .WithTiming()) { var parameters = new Dictionary <string, ParameterInfo>(); var type = Models.ParameterType.Type; var valueType = ParameterValueType.String; foreach (var property in properties) { if (property.Info.TryGetValue("InjectionType", out var typeValue)) { type = typeValue.ToEnum(Models.ParameterType.Type); } object value = null; if (property.Selected && (property.Value.LogicalValue != null || property.Value.NumericValue != null || property.Value.Description != null)) { switch (property.Type) { case "N": valueType = ParameterValueType.Numeric; var etimDisplayUnitType = UOLAddInUtilities.ConvertEUCode(property.UnitCode); value = parameterHelper.ConvertToAPI((double)property.Value.NumericValue, etimDisplayUnitType); break; case "L": valueType = ParameterValueType.Boolean; value = property.Value.LogicalValue; break; default: value = property.Value.Code ?? property.Value.Description; valueType = ParameterValueType.String; break; } var propertyName = $"{property.Code}_{property.PortCode}_"; if (!parameters.ContainsKey(propertyName)) { parameters.Add(propertyName, new ParameterInfo() { Name = propertyName, Type = type, Value = value, ValueType = valueType }); } } } return(parameters); } }
public static bool UpdatePropertiesWithValuesFromFamily(Element loadedElementOrType, IEnumerable <CADProperty> properties, bool setUserDefinedValues = false, bool deleteUnknownProperties = false) { var hasUserDefinedValues = false; var monitoredExecutionContext = ApplicationGlobals.ApplicationContext.GetService <IMonitoredExecutionContext>(); var parameterHelper = new ParameterHelper(); using (var monitoredExecutionBlock = monitoredExecutionContext .MonitorMethod <UOLAddInUtilities>(nameof(UpdatePropertiesWithValuesFromFamily)) .WithParameter(nameof(loadedElementOrType), loadedElementOrType) .WithParameter(nameof(properties), properties) .WithParameter(nameof(setUserDefinedValues), setUserDefinedValues) .WithTiming()) { var propertiesToDelete = new List <CADProperty>(); foreach (var cadProperty in properties) { if (setUserDefinedValues || (!setUserDefinedValues && !cadProperty.Selected) || (!setUserDefinedValues && deleteUnknownProperties)) { var propertyName = cadProperty.Code.StartsWith("uob_prod_", StringComparison.OrdinalIgnoreCase) ? $"{cadProperty.Code}" : $"{cadProperty.Code}_{cadProperty.PortCode}_"; var revitParameter = parameterHelper.GetParameterBySearchString(loadedElementOrType, propertyName, true); if (revitParameter == null || !revitParameter.HasValue) { if (revitParameter == null && deleteUnknownProperties) { propertiesToDelete.Add(cadProperty); } continue; } switch (revitParameter.StorageType) { case StorageType.Double: var etimDisplayUnitType = UOLAddInUtilities.ConvertEUCode(cadProperty.UnitCode); double?parameterDoubleValue = Math.Round(parameterHelper.ConvertFromAPI(etimDisplayUnitType, revitParameter.AsDouble()), 6); if (parameterDoubleValue == 0 && cadProperty.Value.NumericValue == null) { parameterDoubleValue = cadProperty.Value.NumericValue; } if (setUserDefinedValues && !parameterDoubleValue.Equals(cadProperty.Value.NumericValue)) { cadProperty.UserDefinedValue = new CADPropertyValue { NumericValue = parameterDoubleValue }; cadProperty.Selected = true; hasUserDefinedValues = true; } else if (!setUserDefinedValues) { cadProperty.Value.NumericValue = parameterDoubleValue; } break; case StorageType.Integer: if (cadProperty.Type == "L") { var parameterBooleanValue = Convert.ToBoolean(revitParameter.AsInteger()); if (setUserDefinedValues && !parameterBooleanValue.Equals(cadProperty.Value.LogicalValue)) { cadProperty.UserDefinedValue = new CADPropertyValue { LogicalValue = parameterBooleanValue }; cadProperty.Selected = true; hasUserDefinedValues = true; } else if (!setUserDefinedValues) { cadProperty.Value.LogicalValue = parameterBooleanValue; } } else { double?parameterIntegerValue = revitParameter.AsInteger(); if (parameterIntegerValue == 0 && cadProperty.Value.NumericValue == null) { parameterIntegerValue = cadProperty.Value.NumericValue; } if (setUserDefinedValues && !parameterIntegerValue.Equals(cadProperty.Value.NumericValue)) { cadProperty.UserDefinedValue = new CADPropertyValue { NumericValue = parameterIntegerValue }; cadProperty.Selected = true; hasUserDefinedValues = true; } else if (!setUserDefinedValues) { cadProperty.Value.NumericValue = parameterIntegerValue; } } break; case StorageType.String: var parameterStringValue = revitParameter.AsString(); if (parameterStringValue.StartsWith("EV", StringComparison.OrdinalIgnoreCase)) { if (setUserDefinedValues && !parameterStringValue.Equals(cadProperty.Value.Code)) { cadProperty.UserDefinedValue = new CADPropertyValue { Code = parameterStringValue, Description = null }; cadProperty.Selected = true; hasUserDefinedValues = true; } else if (!setUserDefinedValues && (string.IsNullOrEmpty(cadProperty.Value.Code) || !cadProperty.Value.Code.Equals(parameterStringValue, StringComparison.OrdinalIgnoreCase))) { cadProperty.Value.Code = parameterStringValue; cadProperty.Value.Description = null; } } else { if (setUserDefinedValues && !(parameterStringValue == string.Empty && cadProperty.Value.Description == null) && !parameterStringValue.Equals(cadProperty.Value.Description)) { cadProperty.UserDefinedValue = new CADPropertyValue { Code = null, Description = string.IsNullOrEmpty(parameterStringValue) ? null : parameterStringValue }; cadProperty.Selected = true; hasUserDefinedValues = true; } else if (!setUserDefinedValues) { cadProperty.Value.Code = null; cadProperty.Value.Description = string.IsNullOrEmpty(parameterStringValue) ? null : parameterStringValue; } } break; case StorageType.ElementId: var parameterElementIdIntegerValue = revitParameter.AsElementId().IntegerValue; if (setUserDefinedValues && !parameterElementIdIntegerValue.Equals(cadProperty.Value.NumericValue)) { cadProperty.UserDefinedValue = new CADPropertyValue { NumericValue = parameterElementIdIntegerValue }; cadProperty.Selected = true; hasUserDefinedValues = true; } else if (!setUserDefinedValues) { cadProperty.Value.NumericValue = parameterElementIdIntegerValue; } break; } } } if (propertiesToDelete.Count > 0) { var filteredProperties = new List <CADProperty>(properties); foreach (var property in propertiesToDelete) { filteredProperties.Remove(property); } properties = filteredProperties; } } return(hasUserDefinedValues); }