Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Макрос для управления пересчетом проекций тяжелых сборок.
 
Не так давно устроился, в качестве консультанта по продуктам T-Flex, по совместительству в одну компанию, занимающуюся проектированием и строительством изделий из металлоконструкций. Приходится разбираться с различными проблемами, в т.ч. и при работе с большими сборками. В компании используется 14-я версия када, но отдельные работы уже выполняются в 15-й версии (не сторонник гонки за обновлениями, поэтому пока сидят в 14-й).
Понаблюдав за пользователями заметил их скучающие взгляды на мониторы и решил разобраться, почему у них все время что-то пересчитывается. Сам последние годы работал в 12-й версии T-Flex CAD (на основной работе закуплена именно эта версия) и был неприятно удивлен новшеству, появившемуся в 14, 15 версиях, а именно - автоматическому пересчету проекций, например, при подавлении операций в 3D. Причем эту фишку никак нельзя отключить.
Конечно же сразу написал в техподдержку об этой проблеме и надеюсь на ее скорое разрешение. Понятно, что для решения этой задачи техподдержке и разработчикам потребуется какое-то время, поэтому нашел выход в написании макроса, который будет изменять параметр обновления всех проекций документа на "Только вручную", и по запросу пользователя обновлять все проекции документа.
Макрос состоит из двух модулей.

Модуль 1: ОтключитьАвтообновлениеПроекций
Код
using System;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace NewMacroNamespace
{
   public class ОтклАвтообновлениеПроекций
   {
      public static void ОтключитьАвтообновлениеПроекций()
      {
         Document document = TFlex.Application.ActiveDocument;

         if(document != null)
           {
            document.BeginChanges("Отключить автообновление проекций");
   
            // Последовательный перебор проекций документа
            foreach(Projection pr in document.GetProjections())
            {
               // Приведение типа Projection к тиу SimpleDrawingProjection
               SimpleDrawingProjection spr = pr as SimpleDrawingProjection;
   
               // Если проекция существует и режим ее пересчета установлен отличным от "Только вручную"
               if (spr != null && spr.RegenerationMode != RegenerationMode.ManualOnly)
               {
                  // Установить режим пересчета проекции "Только вручную"
                  spr.RegenerationMode = RegenerationMode.ManualOnly;
               }
            }
         }

         document.EndChanges();
      }
   }
}
Модуль 2: ОбновитьВсеПроекции
Код
using System;
using TFlex.Model;
using TFlex.Model.Model2D;
using TFlex.Model.Model3D;

namespace NewMacroNamespace
{
   public class ОбновитьПроекции
   {
      public static void ОбновитьВсеПроекции()
      {
         Document document = TFlex.Application.ActiveDocument;
      
         if(document != null)
           {

            document.BeginChanges("Обновить все проекции");
            
            // Последовательный перебор проекций документа
            foreach(Projection pr in document.GetProjections())
            {
               // Приведение типа Projection к тиу SimpleDrawingProjection
               SimpleDrawingProjection spr = pr as SimpleDrawingProjection;
   
               // Если проекция существует и режим ее пересчета установлен отличным от "Автоматически"
               if (spr != null && spr.RegenerationMode != RegenerationMode.Automatic)
               {
                  // Установить режим пересчета проекции "Автоматически"
                  spr.RegenerationMode = RegenerationMode.Automatic;
               }
            }
            
            // Выполнить полный пересчет документа
            RegenerateOptions rg = new RegenerateOptions();
            rg.Full = true;
            document.Regenerate(rg);
            
            // Последовательный перебор проекций документа
            foreach(Projection pr in document.GetProjections())
            {
               // Приведение типа Projection к тиу SimpleDrawingProjection
               SimpleDrawingProjection spr = pr as SimpleDrawingProjection;
   
               // Если проекция существует и режим ее пересчета установлен отличным от "Только вручную"
               if (spr != null && spr.RegenerationMode != RegenerationMode.ManualOnly)
               {
                  // Установить режим пересчета проекции "Только вручную"
                  spr.RegenerationMode = RegenerationMode.ManualOnly;
               }
            }
   
            document.EndChanges();
         }
      }
   }
}

К сообщению прикладываю файл с макросом. Файл нужно скопировать в следующую папку: C:\Program Files\T-FLEX CAD 14 x64\Program\Macros\

P.S. Результат работы макроса. Действия, выполняемые в 3D не приводят к пересчету проекций, файл открывается быстрее, проекции по листу документа перемещаются без пересчета. Как и прежде (в 12 версии) - решение об обновлении проекций остается за пользователем. Причем макрос действует одинаково как на обычные проекции, так и на выносные виды (у которых настройку свойства обновления, в обычном случае, без использования макроса, еще нужно поискать :) )
Изменено: Сергей Максимов - 26.07.2017 23:32:14
 
Цитата
Сергей Максимов написал:
Как и прежде (в 12 версии) - решение об обновлении проекций остается за пользователем.
Хм, не припомню такого....Вроде всегда стояло и стоит "Вручную или при полном пересчёте" Не проще в прототипе сделать так, чтоб сразу задавалось как нужно??? Выставил "Только вручную" и поставил "По умолчанию". Да и ставить "Только вручную" на мой вкус вот совсем не правильно. Потом все овермного проекций ручками обновлять?? А если чего пропустишь?? Меня некоторые подходы скажем так - сильно удивляют....
Толком не остыл...
 
Конечно ставить в прототипе для проекций "Только вручную" неправильно - это ограничение пользователя. В 12-й версии при установленном параметре проекции "Вручную или при полном перечсете" проекция не обновляется автоматически при изменении 3D. Для обновления проекций необходимо запустить команду пересчета либо обновить каждую проекцию, выбрав команду "Обновить" в контекстном меню проекции.
Поэтому макрос состоит из двух модулей: первый модуль меняет свойства всех проекций на "Только вручную", что не приводит к автоматическому обновлению проекций при изменении в 3D, а второй - обновляет все проекции в документе, что гарантирует от случаев, когда какая то проекция не будет обновлена по невнимательности.
Изменено: Сергей Максимов - 27.07.2017 21:50:57
 
По умолчанию в 14ТФ для проекций стоит "Вручную и при полном пересчете". Только вот он зараза запускает пересчет даже если при простановке размеров (или надписей) выберешь опцию скопировать свойства существующего элемента. Когда проекций немного, можно и не замечать такого интересного поведения программы. Но когда проекций десяток, или несколько десятков, то это очень даже чувствительно. И действительно я тоже сижу и тупо смотрю в монитор. Можно конечно просто прогуляться, чтоб не засиживаться. Только вот вопрос чего больше будет - прогулок или работы. На финальной стадии оформления проекта такие нюансу очень даже раздражают. Так что идея с макросом очень даже может облегчить труд проектировщика. Если бы еще это в виде пары кнопок на панели было.
 
По поводу пары кнопок. Во-первых надеюсь, что эту проблему исправят в ближайших обновлениях. А во-вторых, если и писать плагин, то лучше подкопить подобных решений, чтобы была не панель с хаотичным набором разнофункциональных кнопок, а более-менее причесанная по функционалу и в контексте существующих команд. Конечно это все идеализация.
 
По поводу актуальности макроса. Получается не совсем прав оказался. В справке этого не нашел, но опытным путем выяснил: проекции, созданные в предыдущих версиях, даже несмотря на выполнение операции конвертирования файлов в новую версию (15) пересчитываются в несколько раз дольше аналогичных проекций, созданных в 15 версии заново. Теперь остается проверить скорость автообновления на больших сборках, созданных с нуля в 15 версии. Осмелюсь предположить, учитывая новшества (возможность игнорирования проецирования мелких элементов) 15 версии, что актуальность приведенного макроса будет поставлена под сомнение. Но надо проверять!

P.S. Хе. После проверки на небольшой сборке отловил таки. После манипуляций со страницами и последующем откате - программа пересчитывает все проекции. Короче пользуйтесь макросом - штука пока что полезная. :)
Изменено: Сергей Максимов - 10.08.2017 21:43:19 (После проверки на небольшой сборке.)
 
Установил версию 15.1. Повторил действия с подавлением операций в трехмерной модели - проекции больше не пересчитываются. 8) Но при манипуляциях со страницами (переименование, назначение правил наименования, создания нескольких новых страниц по правилам наименования и последующей отмене всех действий со страницами) пересчет проекций все же выполняется. Но стоит отметить, что такой сумбур со страницами вряд ли будет выполнять много пользователей. Это так- позагонять программу в угол.
Изменено: Сергей Максимов - 18.08.2017 21:53:25
Страницы: 1