/// <summary>
        /// Create project parameters.
        /// </summary>
        public static void CreateProjectParameter(bool isAddShared)
        {
            DefinitionFile sharedParameterFile;

            try
            {
                sharedParameterFile = revitDocument.Application.OpenSharedParameterFile();
            }
            catch
            {
                throw new ArgumentException("Проблема в файле общих параметров. Пожалуйста, выберите другой файл или создайте новый");
            }

            if (isAddShared && ((sharedParameterFile == null) || (sharedParameterFile.Filename == string.Empty)))
            {
                throw new ArgumentException("Выбранный файл общих параметров не существует. Пожалуйста, выберите другой файл или создайте новый");
            }

            try
            {
                List <RevitParameter> dataList = ParamsHelper.LoadExcel();

                if (dataList == null)
                {
                    return;
                }

                AddFamilyParametersResult familyParametersResult;
                using (var t = new Transaction(revitDocument))
                {
                    t.Start($"Adding Parameters from Excel");

                    if (revitDocument.IsFamilyDocument)
                    {
                        familyParametersResult = new AddFamilyParametersResult(revitDocument.OwnerFamily);
                        AddFamilyParameters.VM.FamilyListViewModel.AddFamilyParameters(revitDocument, dataList, familyParametersResult, isAddShared, false);
                    }
                    else
                    {
                        familyParametersResult = new AddFamilyParametersResult(revitDocument);
                        AddDocumentParameters(dataList, sharedParameterFile, familyParametersResult);
                    }

                    t.Commit();
                }

                AddFamilyParametersResult.ShowResultsDialog(new List <AddFamilyParametersResult> {
                    familyParametersResult
                });
            }
            catch (Exception e)
            {
                TaskDialog.Show("Adding Project Parameters", e.Message);
            }
        }
        /// <summary>
        /// The add family parameters.
        /// </summary>
        /// <param name="families">
        /// The families.
        /// </param>
        /// <param name="isAddShared"></param>
        /// <param name="checkProject"></param>
        /// <exception cref="ArgumentException">Throws when no families are checked
        /// </exception>
        public static void AddFamilyParameters(ObservableCollection <FamilyCategory> families, bool isAddShared, bool checkProject)
        {
            List <Family> fam = (from familyCategory in families
                                 from item in familyCategory.Members
                                 where ItemHelper.GetIsChecked(item) == true
                                 select item.Family).ToList();

            if (fam.Count == 0)
            {
                throw new ArgumentException("Пожалуйста, выберите семейства, в которые вы хотите добавить параметры");
            }

            if (isAddShared && ((SharedParameterFile == null) || (SharedParameterFile.Filename == string.Empty)))
            {
                throw new ArgumentException("Выбранный файл общих параметров не существует. Пожалуйста, выберите другой файл или создайте новый");
            }

            var results = new List <AddFamilyParametersResult>();
            List <RevitParameter> dataList = ParamsHelper.LoadExcel();

            if (dataList != null)
            {
                foreach (Family family in fam)
                {
                    var familyParametersResult = new AddFamilyParametersResult(family);

                    Document familyDoc;

                    if (family.IsEditable)
                    {
                        familyParametersResult.FamilyDocument = familyDoc = revitDocument.EditFamily(family);
                    }
                    else
                    {
                        familyParametersResult.Skipped = true;
                        results.Add(familyParametersResult);
                        continue;
                    }

                    using (var t = new Transaction(familyDoc))
                    {
                        t.Start($"editing {family.Name}");

                        try
                        {
                            AddFamilyParameters(familyDoc, dataList, familyParametersResult, isAddShared, checkProject);
                        }
                        catch (Exception e)
                        {
                            TaskDialog.Show("Add Family Parameters", e.Message);
                            break;
                        }

                        t.Commit();
                    }

                    results.Add(familyParametersResult);
                }

                if (results.Count != 0)
                {
                    var opt = new FamilyLoadingOptions();

                    foreach (var r in results)
                    {
                        if (r.FamilyDocument != null)
                        {
                            r.FamilyDocument.LoadFamily(revitDocument, opt);
                            r.FamilyDocument.Close(false);
                        }
                    }

                    AddFamilyParametersResult.ShowResultsDialog(results);
                }
            }
        }
        private static void AddDocumentParameters(List <RevitParameter> dataList, DefinitionFile sharedParameterFile, AddFamilyParametersResult results)
        {
            CategorySet categorySet = revitDocument.Application.Create.NewCategorySet();

            foreach (var item in dataList)
            {
                DefinitionGroup    dg = ParamsHelper.GetOrCreateSharedParamsGroup(sharedParameterFile, item.GroupName);
                ExternalDefinition externalDefinition = ParamsHelper.GetOrCreateSharedParamDefinition(dg, item.ParamType, item.ParamName, item.IsVisible);

                Category category = revitDocument.Settings.Categories.get_Item(item.Category);
                categorySet.Insert(category);

                Binding newIb;
                if (item.IsInstance)
                {
                    newIb = revitDocument.Application.Create.NewInstanceBinding(categorySet);
                }
                else
                {
                    newIb = revitDocument.Application.Create.NewTypeBinding(categorySet);
                }

                revitDocument.ParameterBindings.Insert(externalDefinition, newIb, item.ParamGroup);

                if (revitDocument.ParameterBindings.Contains(externalDefinition))
                {
                    revitDocument.ParameterBindings.ReInsert(externalDefinition, newIb);
                }

                results.AddFamilyParameterNote(item);
            }
        }
        public static void AddFamilyParameters(Document familyDoc, List <RevitParameter> dataList, AddFamilyParametersResult results, bool isAddShared, bool checkProject)
        {
            foreach (var item in dataList)
            {
                bool nameIsInUseInFamilyManager = familyDoc.FamilyManager.Parameters.Cast <FamilyParameter>()
                                                  .Any(parameter => parameter.Definition.Name == item.ParamName);

                bool nameIsInProject = false;

                if (checkProject)
                {
                    var iter = revitDocument.ParameterBindings.ForwardIterator();

                    while (iter.MoveNext())
                    {
                        if (iter.Key.Name == item.ParamName)
                        {
                            nameIsInProject = true;
                            break;
                        }
                    }
                }

                bool badCategory = item.Category != (BuiltInCategory)familyDoc.OwnerFamily.FamilyCategory.Id.IntegerValue;

                if (item.Category != (BuiltInCategory)familyDoc.OwnerFamily.FamilyCategory.Id.IntegerValue)
                {
                    throw new ArgumentException("В файле Excel параметру назначена неверная категория семейства. Проверьте корректность файла Excel");
                }

                if (nameIsInUseInFamilyManager || badCategory || nameIsInProject)
                {
                    continue;
                }

                if (isAddShared)
                {
                    if ((familyDoc.Application.OpenSharedParameterFile() == null) || (familyDoc.Application.OpenSharedParameterFile().Filename == string.Empty))
                    {
                        throw new ArgumentException("Выбранный файл общих параметров не существует. Пожалуйста, выберите другой файл или создайте новый");
                    }

                    DefinitionGroup    dg = ParamsHelper.GetOrCreateSharedParamsGroup(familyDoc.Application.OpenSharedParameterFile(), item.GroupName);
                    ExternalDefinition externalDefinition = ParamsHelper.GetOrCreateSharedParamDefinition(dg, item.ParamType, item.ParamName, item.IsVisible);

                    results.AddFamilyParameterNote(familyDoc.FamilyManager.AddParameter(externalDefinition, item.ParamGroup, item.IsInstance));
                }
                else
                {
                    results.AddFamilyParameterNote(familyDoc.FamilyManager.AddParameter(item.ParamName, item.ParamGroup, item.ParamType, item.IsInstance));
                }
            }
        }