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);
        }