Макрос для Ревит удаляющий резервные копии файлов .rfa и .rvt

|  Revit API

Зима постепенно начинается. Немного снега лежит на улице и магазины готовятся к Новому Году. В начале зимы всегда хочется чего-то новенького. Ведь до празника еще далеко, а нам все время про него напоминают. Вы можете добавить себе новый макрос в Ревит.

Когда я делаю много разных и однотипных семейств для Ревит, всегда возникает множество файлов резервных копий, которые выглядят так: *.0001.rfa. Признаться при работе с проектом, также возникает множество подобных файлов вида: *.0001.rvt. Удалять вручную их нет ни желания , ни сил. Особенно когда есть папка, в ней куча подпапок, а в них еще одна куча подпапок. Можете закинуть в диспетчер макросов небольшой скриптик, и он сам будет удалять резервные копии файлов, включая все вложенные папки.

Показать код C# →

/*
 * Created by SharpDevelop.
 * User: Alexander Akunets
 * Date: 30.11.2017
 * Time: 23:46
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
using System.IO;

namespace DeleteCopy
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.DB.Macros.AddInId("8F07AB9C-AFF0-4CE2-8CC0-369DF2E80521")]
    public partial class ThisApplication
    {
        private void Module_Startup(object sender, EventArgs e)
        {

        }

        private void Module_Shutdown(object sender, EventArgs e)
        {

        }
        
        public void DeleteCopy()
        {
            try{                
            string path = ChooseFolder();
            
            List<string> dirs = new List<string>();
            
            dirs = GetDirectories(path, "*", System.IO.SearchOption.AllDirectories); //add subdirectories
            
            dirs.Add(path); // add top directory
            
            foreach(var dr in dirs){
                
                string [] fileEntries = Directory.GetFiles(dr);
            
                foreach (var s in fileEntries)
                {
                    FileInfo fi = new FileInfo(s);
                    
                    if (fi.Extension.ToUpper() == ".RFA" || fi.Extension.ToUpper() == ".RVT")
                    {
                        string [] arr = fi.Name.Split('.');
                        
                        int result = 0;
                        
                        if (arr.Length > 2 && int.TryParse(arr[arr.Length-2], out result))
                        {
                            File.Delete(fi.FullName);
                        }
                    }
                }
            
            }            
            TaskDialog.Show ("Success", "The opertion complited");
            }
            catch {
                TaskDialog.Show ("Error", "The operation has errors");
            }
        }
        
        private string ChooseFolder()
        {
            Ookii.Dialogs.VistaFolderBrowserDialog dlg = new Ookii.Dialogs.VistaFolderBrowserDialog();

            dlg.ShowNewFolderButton = true;
            
            string path = string.Empty;


            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                path = dlg.SelectedPath;              
            }
            
            return path;

        }
        
        private List<string> GetDirectories(string path, string searchPattern = "*",
        SearchOption searchOption = SearchOption.TopDirectoryOnly)
        {
            if (searchOption == SearchOption.TopDirectoryOnly)
                return Directory.GetDirectories(path, searchPattern).ToList();
    
            var directories = new List<string>(GetDirectories(path, searchPattern));
    
            for (var i = 0; i < directories.Count; i++)
                directories.AddRange(GetDirectories(directories[i], searchPattern));
    
            return directories;
        }        

        #region Revit Macros generated code
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(Module_Startup);
            this.Shutdown += new System.EventHandler(Module_Shutdown);
        }
        #endregion
    }
}

Кроме самого макроса, вам понадобится библиотека Ookii.Dialogs.dll, которая позволяетсяя выбирать папки в и файлы в стиле Windows Vista, вот так вот:

Рабочий метод DeleteCopy. Вспомогательный метод ChooseFolder помогает выбрать путь к корневой папке, а еще однин метод GetDirectories выбирает все подпаки в корневой директории.

А теперь подробнее о создании макроса. Заходим в Ревите в Диспетчер макросов и создаем новый модуль DeleteCopy.

Далее в редакторе очищаем все и вставляем код макроса.

Теперь добавим нужные библиотеки. Нажимаем правой клавишей на Ссылки и добавляем библитеку System.Windows.Forms. Потом через вкладку Броузер сборок .NET добавим сборку Ookii.Dialogs.dll, которую можете скачать тут.

Нажимаем F9, проверем все ли хорошо и в диспечере макросов разворачиваем модуль DeleteCopy и запускаем макрос. 

Вы можете заметить, что в данном макросе не используется методов из Revit API, кроме TaskDialog.Show. Этот метод выводит информацию в сервисное окошко Ревита и этот метод можно заменить или удалить. Это значит, что можно построить небольшое WPF или консольное приложение и очищать папки от дубликатов .rfa и .rvt файлов не запуская Ревит.

Поддержите мои бесплатные приложения для Revit. Нажмайте "Нравится"!

Узнавайте о новых расширениях для Revit подписавшись на страницу BIM3D в Твиттере!

Извините за предствленные неудобства. Всплывающее окно не побеспокоит Вас в ближайшее время!

Связанные новости ►

Назад