среда, 18 апреля 2012 г.

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

Обновился Менеджер листов до версии 1.1. Была повышена устойчивость к ошибкам. Например связанными с удалением или изменением id параметров Альбома (такое случается при совместной работе через файл хранилища, но достаточно редко).

Скачать новую версию можно тут.

вторник, 20 марта 2012 г.

Случайное решение.


Сегодня в нашем совместном чате сообщества появилась интересная картинка от Алексея Борисова такого вида:

Внимание постановка ))))
Как видно из скриншота выше вкладки у ленты переставлены. Сформировалось два вопроса:
  1. Как такое получилось?
  2. И главное как вернуть все назад?
Пошел процесс поиска в интернете и как такой вариант на вскидку был дан попробовать потаскать их с зажатым ctrl или alt (это мои стандартные действия если что-то не перетаскивается обратно или не кликается). Видимо у разработчиков эти действия тоже перешли в ряд стандартных и о чудо! При зажатом ctrl панели перетасовываются между собой!!! Вот так совместными усилиями мы с Алексеем открыли "новую" фишечку в Revit, а вы теперь про нее знаете и можете ее использовать.

вторник, 6 марта 2012 г.

Дополнение Distancer

Это дополнение я создал, когда выполнял один дизайн проект помещения. Мне нужно было разместить стержни волной (волна создается разностью длин этих стержней), при этом заспецифицировать каждый из них по длине. Я пошел по пути максимального использования штатных возможностей Revit. Данное дополнение просто передает значение расстояния от указанной точки до выбранного объекта в любой его числовой параметр экземпляра. То есть с помощью стандартных формул в Revit, используя этот параметр можно редактировать влияние расстояния на геометрию. Думаю понятнее будет если посмотреть видео :)


Скачать его можно отсюда (download).

Делимся результатами экспериментирования с дополнением )))
Добавлен тестовый файл с англоязычными параметрами (I has added a test project file)

Менеджер листов: работа над ошибками

Приветствую!
Недавно провел работу над ошибками в Менеджере листов. Пока поправил не все ошибки о которых мне сообщили, но возможно многим будет уже полегче. Ошибка связана с первым запуском менеджера, когда он вылетает на настройках.

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

среда, 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 точки.
Успехов в проектировании и совершенствовании своих навыков!
Данное дополнение можно скачать по этой ссылке:
Так же присутствует английская версия.