Макрос, который обновляет семейства

|  Revit API

Нужно пересохранить в текущей версии много семейств для Revit? Больше никакой ручной рутины. Мой макрос спешит на помошь! Он просканирует все папки, начиная от указанной, пересохранит все семейства, удалит бекапы. И все это одним кликом! Вы можете пить кофе.

Открыть 200 семейств, пересохранить их в версии Revit 2016. Потом повторить это для Revit 2017 и 2018 да и еще и в новой версии Revit 2019. А еще в каждом семействе нужно материал подправить. Стоп, а когда же жить, зачем тратить лучшие годы на рутину? Вот тут в магазине продается приложение по подписке за 2,5$ в месяц, которое может хотя бы пересохранить семейства Revit в текущей версии.

Что же, пора устроить аттракцион невиданной щедрости! :-)

В общем смотрим ниже текст макроса. У меня он работает бесплатно.

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

/*
 * Created by SharpDevelop.
 * User: Alexandr Akunets
 * Site: www.bim3d.ru
 * E-mail: akunets@gmail.com
 * Date: 4/26/2018
 * Time: 10:26 AM
 * 
 * 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 UpdateFamilies
{         
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.DB.Macros.AddInId("3CE41D75-5EFA-4AB5-A57C-62F9D8CBE48C")]
    public partial class ThisApplication
    {
        private void Module_Startup(object sender, EventArgs e)
        {

        }

        private void Module_Shutdown(object sender, EventArgs e)
        {

        }
        
        public void UpdateFamilies()
        {            
            var uidoc = this.ActiveUIDocument;
            var doc = uidoc.Document;
            
            try
            {
                string path = ChooseFolderDialog();
                
                var dirs = GetDirectories(path, "*", System.IO.SearchOption.AllDirectories);
                
                List<FileInfo> rfas = new List<FileInfo>();
                
                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" && !rfas.Contains(fi))
                        {
                            rfas.Add(fi);
                        }
                    }            
                } 
                    
                foreach (var rfa in rfas)
                {                        
                    var doc0 = this.Application.OpenDocumentFile(rfa.FullName);        
                    
                    //Тут мы можем добавить какую-либо полезную работу
                    
                    doc0.Close();
                }
                
                DeleteCopy0001(path);
                
                TaskDialog.Show("Complite", "Задание выполнено");
            }
            catch(Exception e){
                
                TaskDialog.Show("error", e.Message +"\n"+e.StackTrace);
            }
            
        }
        
        public void DeleteCopy0001(string path)
        {
            
            try{    
            
                var dirs = GetDirectories(path, "*", System.IO.SearchOption.AllDirectories);
                
                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);
                            }
                        }
                    }
                
                }
            }
            catch {
                TaskDialog.Show ("Error", "The operation has errors");
            }
        }
        
        private static 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));
        
        directories.Add(path);

        return directories;
        }
        
        private string ChooseFolderDialog()
        {
            System.Windows.Forms.FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();

            dlg.ShowNewFolderButton = true;

            string path = string.Empty;

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

            return path;
        }

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

Установка. Вариант 1

В Диспетчере макросов создаем новый макрос с именем "UpdateFamily". Как устанавливать смотрим на примере макроса Уравнителя стен.

Не забудьте добавить в Ссылки (References) макроса системную библиотеку "System.Windows.Forms". Как добавлять ссылку можно прочитать на примере макроса удаляющего бак-копии Ревита.

Установка. Вариант 2

Ну и немного для ленивых! Качаем архив UpdateFamilies.zip. Копируем папку "UpdateFamilies" из архива вот сюда: "C:\ProgramData\Autodesk\Revit\Macros\2018\Revit\AppHookup".

Вместо сегмента "2018" в пути должен быть номер версии вашего Ревита.

Работа макроса

В результате всех манипуляций в Диспетчере макросов у нас появится макрос "UpdateFamilies", который будет работать в любой версии Ревит, для которой он установлен.

Макрос открывает каждое семейство в фоне и пересохраняет его в текущей версии и закрывает.

Вот как он работает:

  1. Открываем любой или создаем пустой проект, если он еще не открыт.
  2. Запускаем макрос.
  3. Выбираем корневую папку в которой разложены по папкам 100500 семейств для устаревших версий Ревит.
  4. Идем пить кофе.
  5. ???
  6. Profit!!!

В результате работы макроса вы получите семейства, которые уже пере-сохраненны в новой версии Ревит, да и еще все их бэк-копии будут выброшены в корзину. Скрипач (бэк-копии) не нужен, родной 8-)

Нравятся использовать макросы, тогда поделись этой статьей в социальных сетях.

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

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

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

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

Назад