среда, 28 декабря 2011 г.

Обновление Менеджера листов

Доброго времени суток всем!
На форуме появился пост с ошибкой, связанной с менеджером листов. Совместными усилиями с  MaxHomeStudio удалось решить эту проблему. Как выяснилось значения скрытого параметра, куда записывается настройка менеджера, обнулились, что привело к ошибке. Новая версия менеджера проверяет правильность синтаксиса значения этого параметра и в случае ошибки предлагает перенастроить менеджер заново (указать ключевые параметры).

Скачать его можно тут.

воскресенье, 11 декабря 2011 г.

Получение и передача значений параметров.

Приветствую!
Недавно мне был задан вопрос по моему дополнению "Копирование параметров". Интересует каким образом получать и передавать параметры из разных объектов. Давайте начнем по порядку.

Прежде всего как нам позволить пользователю выбирать объекты. У нас есть возможность программно запустить процесс выбора объекта или обработать уже выбранные пользователем  до запуска нашей команды объекты. Первый способ выглядит так:


         Element pickedEl;
            try
            {
                var pickedRef = vnuiDocument.Selection.PickObject(ObjectType.Element, "Укажите элемент, чьи параметры будут копироваться(ESC - отмена)");
                pickedEl = vnuiDocument.Document.GetElement(pickedRef);
            }
            catch
            {
                pickedEl = null;
            }
            if (pickedEl == null)
                return Result.Cancelled;
pikedEl в данном контексте является переменной, которой будет присвоен выбранный элемент. Затем используется ключевое слово try и catch. Данные ключевые слова перехватывают исключения, проще говоря ошибки и позволяют нам их обработать. В данном случае я присваиваю нулевое значение pikedEl и в дальнейшем при нулевом значении выбранного элемента отменяю действия команды. При этом выполнение команды заканчивается.
Далее уже идет непосредственно сам метод, который позволяет пользователю сделать выбор объекта в рабочей области.

var pickedRef = vnuiDocument.Selection.PickObject(ObjectType.Element, "Укажите элементчьи параметры будут копироваться(ESC - отмена)");
pickedEl = vnuiDocument.Document.GetElement(pickedRef);

В атрибутах метода указан тип объекта для выбора ObjectType.Element и текст, который будет написан в строке состояния Revit. В качестве результата возвращается объект класса Reference.
Затем с помощью метода 
GetElement мы получаем элемент, который выбран пользователем. vnuiDocument это элемент класса UIDocument который мы получаем в самом начале кода.

UIDocument vnuiDocument = commandData.Application.ActiveUIDocument;

Второй способ выглядит так:
var refer = commandData.Application.ActiveUIDocument.Selection.Elements;

Из данного свойства мы получаем массив выбранных пользователем элементов до старта нашей команды.

Как получить элементы, выбранные пользователем разобрались. Теперь выясним как получить параметры элемента. Для этого достаточно получить массив параметров из свойства .Parameters элемента. Таким образом мы получим все параметры данного элемент. Но очень важный момент. В данном случае мы получим параметры вхождения, так как данный элемент является вхождением типа. Для параметров типа нужно получить элемент типа вхождения. Для этого нужно использовать метод .GetTypeId() и получив ElementId типа забрать его методом vnuiDocument.Document.GetElement(ElementId) Передав туда атрибутом ElementId.  
Для получения строкового значения параметра (то есть так, как оно написано в свойствах) используется вот этот метод:
/// <summary>
        /// Строковое значение параметра.
        /// summary>
        public string ParameterValueString
        {
            get
            {
                switch (Parameter.StorageType)
                {
                    case StorageType.Double:
                return Parameter.AsValueString();
                break;
                    case StorageType.Integer:
                if (Parameter.Definition.ParameterType == ParameterType.YesNo)
                {
                    if (Parameter.AsInteger() == 0)
                        return "false";
                    else
                        return "true";
                   
                }
                return Parameter.AsValueString();
                break;
                    case StorageType.String:
                return Parameter.AsValueString();
                break;
                    case StorageType.ElementId:
                Document doc = Parameter.Element.Document;
                string znachenie = "";
                Element el = doc.get_Element(Parameter.AsElementId());
                if (el != null)
                    znachenie = el.Name;
                else
                    znachenie = Parameter.AsValueString();
                return znachenie;
                break;
                    default:
                        return null;
                        break;
                }
            }
        }

Как видно почти везде используется метод .AsValueString(). Он возвращает строковое значение параметра, так как оно написано в свойствах. Но не все параметры возвращаются корректно. Например значение типа "Да\Нет". Для этого нужно определить тип представления параметра
if (Parameter.Definition.ParameterType == ParameterType.YesNo) 
и затем принудительно задать значение текста в зависимости от числового значения
                    if (Parameter.AsInteger() == 0)
                        return "false";
                    else
                        return "true";
Так же нужно обрабатывать значения параметров, которые содержат типы элементов. Это такие параметры, как например Базовая зависимость, Материал и т.д. Для этого нужно получить ElemenId параметра и затем вытащить элемент из документа а строке присвоить имя этого элемента. Если данный элемент отсутствует, то возвращаем строковое значение этого параметра.
                Document doc = Parameter.Element.Document;
                string znachenie = "";
                Element el = doc.get_Element(Parameter.AsElementId());
                if (el != null)
                    znachenie = el.Name;
                else
                    znachenie = Parameter.AsValueString();
                return znachenie;

Как получать читабельные значения параметров мы разобрались. Теперь разберемся как передавать эти значения. Тут все гораздо проще

        /// <summary>
        /// Копирует значения из параметра в соответствующий по имени параметр элемента
        /// summary>
        /// <param name="par">Параметрparam>
        /// <param name="El">Элемент, в который производится копированиеparam>
        private void CopyParameter(Parameter par, Element El)
        {
            Parameter toPar = El.get_Parameter(par.Definition.Name);
            if (toPar != null)
            {
                switch (par.StorageType)
                {
                    case StorageType.Double:
                        try
                        {
                            toPar.Set(par.AsDouble());
                        }
                        catch
                        { break; }
                        break;
                    case StorageType.String:
                        try
                        {
                            toPar.Set(par.AsString());
                        }
                        catch
                        { break; }
                        break;
                    case StorageType.Integer:
                        try
                        {
                            toPar.Set(par.AsInteger());
                        }
                        catch
                        { break; }
                        break;
                    case StorageType.ElementId:
                        try
                        {
                            toPar.Set(par.AsElementId());
                        }
                        catch
                        { break; }
                        break;
                    default:
                        break;
                }
            }
        }

Получив в качестве исходных данных целевой элемент El и параметр из которого будет копироваться значение par мы из элемента извлекаем параметр со схожим именем в строке
Parameter toPar = El.get_Parameter(par.Definition.Name);
Затем если такой параметр присутствует передаем ему значение из полученного в атрибутах параметра. Но передаем мы его в соответствии с типом переменной целевого элемента. При этом отлавливаем все ошибки передачи, такие как несовпадение типов параметра (имена могут определятся пользователем при создании элемента).



Итак мы рассмотрели:
  • способы получения выбранных пользователем элементов;
  • как получить параметры элемента;
  • как получить читабельное значение параметра;
  • получение параметра по имени;
  • и передачу значения параметра.
Надеюсь статья помогла кому-то разобраться в работе с параметрами элементов. Удачи в освоении Revit API! Пишите комментарии и посещайте форум сообщества. Так же следите за новостями. Может когда-то поблизости пройдет САПРяжение и нам удастся поговорить в живую :)

пятница, 7 октября 2011 г.

Дополнение "Рабочая плоскость"


На недавно прошедшем Autodesk Форуме в Москве ко мне пришла идея нового дополнения, которое я благополучно реализовал в перерывах на форуме. Немного допилив его я получил вот такой результат:
Данное дополнение позволяет указать рабочую плоскость по 3 правилам. Итак рассмотрим их.
Данное дополнение находится во вкладке KartsUP ->Редактирование. Состоит из 2-х элементов управления: кнопки запуска дополнения и выбора способа построения рабочей плоскости.
Прежде всего имеет смысл поудобнее настроить рабочею среду, а точнее разместить элементы управления в панель быстрого доступа.

Для этого щелчком правой кнопки мыши вызовем меню и в нем укажем пункт «Добавить на панель быстрого доступа».

Раскроем список панели быстрого доступа и в нем выберем пункт «Адаптировать панель быстрого доступа».

В диалоговом окне добавим разделитель между инструментами.
Просмотрим по порядку все доступные режимы выбора плоскости.

Первый вариант через выбор плоскости объекта.

Активировав инструмент через кнопку нам предлагается выбрать плоскость элемента, по которой будет создана рабочая плоскость. В отличии от стандартного инструмента не выводится никакого промежуточного диалогового окна, так же как в среде концептуального проектирования.

Для наглядности включим отображение рабочей плоскости.



Следующий режим с выбором прямой грани и точки на плоскости.


Сначала нам предлагается выбрать грань объекта.


Затем мы должны выбрать грань на которой мы в дальнейшем укажем точку.

После этого мы должны указать точку, которая будет лежать на плоскости ранее выбранной грани.



В результате мы получим плоскость которая будет содержать нашу точку и грань.

Последний вариант с указанием 3-х точек.

Точки указываются так же как и в предыдущем варианте: сначала плоскость на которой будет лежать точка……

….а затем и сама точка на этой плоскости.

Выбрав таким способом 3 раза точки в пространстве мы получаем плоскость содержащею все эти 3 точки.
Успехов в проектировании и совершенствовании своих навыков!
Данное дополнение можно скачать по этой ссылке:
Так же присутствует английская версия.

четверг, 6 октября 2011 г.

Осваиваем Mental ray. Продолжение.


Итак у меня появилась свободная минутка и решил я ее потратить не только на доделывание дополнений, но и продолжить анализ mental ray. На этот раз более детально погрузился в изучение поведения прокси объектов ментала. Совместно с плагином Forest Pack мне удалось добиться вот таких результатов. Основная цель была создание более или менее правдоподобной травы. Forest Pack помог мне её размножить по поверхности. В подробности по количеству объектов я не вдавался, но поверьте их тут очень много!!!!


Массив травы состоит из отдельно смоделированных пучков:



так выглядит 3Д окно с размноженными прокси объектами. Как видите Forest Pack размножает их в пределах обзора камеры (это естественно можно отключить) что существенно снижает нагрузку на оперативку.



Не знаю как вам, но результат мне по душе. Буду совершенствовать дальше свой виртуальный растительный мир.

вторник, 4 октября 2011 г.

Проблемы запуска дополнений.

Если у кого-то не запускаются дополнения (не появляются кнопки показанные на видео) то есть одно решение. В папке, куда вы устанавливали дополнение, щелкните правой кнопкой мыши по всем dll файлам и в свойствах этих dll нажмите кнопку разблокировать. Если вы не меняли путь установки то все мои дополнения по умолчанию ставятся в эти папки:
  • Если используется Windows XP: C:\Documents and Settings\All Users\Application Data\Autodesk\Revit\Addins\2011\

  • Если Windows 7: C:\ProgramData\Autodesk\Revit\Addins\2011\
Если не помогло, то не стесняйтесь и пишите об ошибке здесь мне на почту kurakovart@gmail.com. Надеюсь эта информация окажется полезной, как и мои дополнения.

Обновление Менеджера листов Revit 2012.

Наконец то доделал менеджер листов для 2012 версии. Дело затянулось изза новой функции в менеджере. Итак что же это за нововведение:
  • Изменяет стандартную нумерацию листов Revit по правилу <Название Альбома> <номер листа дополнения>.
Более общая информация о менеджере листов в этом посте.
Revit 2011 download.

вторник, 9 августа 2011 г.

Тренинги по Revit API перед Форумом в Москве.

19 и 20 сентября перед форумом в Москве будут проводиться тренинги. Среди них так же будет тренинг по Revit API, который буду проводить я. Мне и вам очень было бы полезно, если те, кто будут присутствовать на нем зададут интересующие их вопросы тут на моем блоге, чтоб я смог более подробно ими заняться до тренингов и у нас бы получился более конструктивный диалог. Так же возможно продолжение беседы уже на форуме Autodesk, где нас не будет поджимать время и моя замотанность )))) Жду всех с нетерпением!
Регистрация на тренинг тут.
На Autodesk форум тут.