Esempio n. 1
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Debug.Listeners.Clear();
            Debug.Listeners.Add(new RbsLogger.Logger("FixSlowFile"));
            string startTime = DateTime.Now.ToLongTimeString();

            Debug.WriteLine("Start time " + startTime);
            Document doc = commandData.Application.ActiveUIDocument.Document;

            //получить все типы арматуры
            List <RebarBarType> rebarTypes = new FilteredElementCollector(doc)
                                             .WhereElementIsElementType()
                                             .OfClass(typeof(RebarBarType))
                                             .Cast <RebarBarType>()
                                             .ToList();

            Debug.WriteLine("Rebar types found: " + rebarTypes.Count.ToString());
            if (rebarTypes.Count == 0)
            {
                TaskDialog.Show("Error", "В файле нет типов арматурных стержней");
                return(Result.Failed);
            }

            //посмотрю, какие общие параметры проекта добавлены для типа арматуры
            Dictionary <string, MyProjectSharedParameter> projectParamsStorage = new Dictionary <string, MyProjectSharedParameter>();
            RebarBarType firstBarType = rebarTypes.First();

            foreach (Parameter param in firstBarType.ParametersMap)
            {
                string paramName = param.Definition.Name;
                if (!param.IsShared)
                {
                    continue;
                }
                MyProjectSharedParameter mpsp = new MyProjectSharedParameter(param, doc);
                projectParamsStorage.Add(paramName, mpsp);
                Debug.WriteLine("Shared parameter found: " + paramName);
            }

            //запоминаю все типы арматуры со значениями параметров
            List <MyRebarType> myrebarTypes = new List <MyRebarType>();

            foreach (RebarBarType rbt in rebarTypes)
            {
                MyRebarType mrt = new MyRebarType(rbt);
                myrebarTypes.Add(mrt);
                Debug.WriteLine("Rebat type saved: " + mrt.bartype.Name);
            }


            DefinitionFile deffile = null;

            try
            {
                deffile = commandData.Application.Application.OpenSharedParameterFile();
            }
            catch
            {
                TaskDialog.Show("Ошибка", "Не найден файл общих параметров");
                Debug.WriteLine("Shared parameters file isnt found");
                return(Result.Cancelled);
            }

            if (deffile == null)
            {
                TaskDialog.Show("Ошибка", "Некорректный файл общих параметров");
                Debug.WriteLine("Shared parameters file is incorrect");
                return(Result.Cancelled);
            }



            //удаляю параметр проекта (если только 1 категория) или снимаю флажок с категории несущей арматуры (если категорий несколько)
            using (Transaction t = new Transaction(doc))
            {
                Debug.WriteLine("Start clear parameters");
                t.Start("Удаляю параметры несущей арматуры");
                {
                    foreach (var kvp in projectParamsStorage)
                    {
                        MyProjectSharedParameter myProjectParam = kvp.Value;
                        if (myProjectParam.categories.Count == 1)
                        {
                            //параметр только для несущей арматуры, значит надо удалить целиком
                            //перед этим проверяю, есть ли параметр в фопе

                            bool checkParamExistsInDefFile = SharedParamsFileTools.CheckParameterExistsInFile(deffile, myProjectParam.guid);
                            if (!checkParamExistsInDefFile)
                            {
                                SharedParamsFileTools.AddParameterToDefFile(deffile, "NonTemplate parameters", myProjectParam);
                            }


                            doc.ParameterBindings.Remove(myProjectParam.def);
                            Debug.WriteLine("Parameter is deleted: " + myProjectParam.Name);
                        }
                        else
                        {
                            //категорий несколько, надо убрать флажок с категории несущей арматуры
                            myProjectParam.RemoveOrAddFromRebarCategory(doc, firstBarType, false);
                            Debug.WriteLine("Flag for rebars deleted for parameter: " + myProjectParam.Name);
                        }
                    }
                }
                t.Commit();
            }


            Debug.WriteLine("All parameters are deleted, go to recover");

            //возвращаю параметры обратно
            using (Transaction t2 = new Transaction(doc))
            {
                t2.Start("Добавляю параметры обратно");

                foreach (var kvp in projectParamsStorage)
                {
                    MyProjectSharedParameter myProjectParam = kvp.Value;
                    if (myProjectParam.categories.Count == 1)
                    {
                        //параметр был несущей арматуры, был удален совсем, значит создаю параметр
                        myProjectParam.AddToProjectParameters(doc, firstBarType);
                        Debug.WriteLine("New parameter is created: " + myProjectParam.Name);
                    }
                    else
                    {
                        //категорий было несколько, возвращаю флажок к категории несущей арматуры
                        myProjectParam.RemoveOrAddFromRebarCategory(doc, firstBarType, true);
                        Debug.WriteLine("Flag recovered for parameter: " + myProjectParam.Name);
                    }
                }

                t2.Commit();
            }

            Debug.WriteLine("Start recover parameter values");
            //восстанавливаю значения у типов арматуры
            using (Transaction t3 = new Transaction(doc))
            {
                t3.Start("Восстанавливаю значения параметров");

                foreach (MyRebarType mrt in myrebarTypes)
                {
                    RebarBarType rbt = mrt.bartype;
                    Debug.WriteLine("Processed rebar type: " + mrt.Name);

                    foreach (Parameter param in rbt.ParametersMap)
                    {
                        string           paramName = param.Definition.Name;
                        MyParameterValue mpv       = mrt.ValuesStorage[paramName];
                        if (mpv.IsNull)
                        {
                            continue;
                        }
                        mpv.SetValue(param);
                        Debug.WriteLine("Parameter " + paramName + ", set value " + mpv.ToString());
                    }
                }

                t3.Commit();
            }
            string endTime = DateTime.Now.ToLongTimeString();
            string msg     = "Выполнено! Время старта: " + startTime + ", окончания: " + endTime;

            TaskDialog.Show("Fix", msg);
            Debug.WriteLine(msg);

            return(Result.Succeeded);
        }
        public static ExternalDefinition AddParameterToDefFile(DefinitionFile defFile, string groupName, MyProjectSharedParameter myparam)
        {
            DefinitionGroup        tempGroup = null;
            List <DefinitionGroup> groups    = defFile.Groups.Where(i => i.Name == groupName).ToList();

            if (groups.Count == 0)
            {
                try
                {
                    tempGroup = defFile.Groups.Create(groupName);
                }
                catch (Exception ex)
                {
                    throw new Exception("Не удалось создать группу " + groupName + " в файле общих параметров " + defFile.Filename);
                }
            }
            else
            {
                tempGroup = groups.First();
            }


            Definitions defs = tempGroup.Definitions;
            ExternalDefinitionCreationOptions defOptions =
                new ExternalDefinitionCreationOptions(myparam.Name, myparam.def.ParameterType);

            defOptions.GUID = myparam.guid;

            ExternalDefinition exDef = defs.Create(defOptions) as ExternalDefinition;

            if (exDef == null)
            {
                throw new Exception("Не удалось создать общий параметр " + myparam.Name);
            }
            return(exDef);
        }