среда, 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 форум тут.

вторник, 5 июля 2011 г.

Обновление дополнения "Копирование параметров"

Обновилось дополнение "Копирование параметров". Основным нововведением является английская версия. Прошу всех, у кого установлена не русскоязычная версия Revit 2012 проверить переключение на английскую версию дополнения (переключение автоматическое).

All who have installed Revit 2012 non-Russian-language version, please, check to switching add-on to English version (switch automatically).
  • Поправлены некоторые некорректные отображения параметров.
  • Присутствует англоязычная версия (Язык дополнения зависит от языковой версии Revit)

Обновление для Revit 2012: загрузка (download).
Ссылка для Revit 2011: загрузка (download).

Подробнее по дополнению в этом сообщении.

четверг, 23 июня 2011 г.

Обновление дополнений редактирования.

Обновилась версия набора редакторов от меня. Теперь он идет с новым инсталлером.
  • Автоматический контроль отзеркаленных дверей можно отменить и свободно пользоваться другими дополнениями.
  • Отключается контроль для приложения, независимо от открытых документов.
  • Все дополнения находятся в новой вкладке KartsUp. Там же и отключение антиотзеркаливания.
Англоязычная версия на подходе.

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


Версии для 2011 Revit по прежнему доступны здесь:

Описание дополнений в этой и этой статье.

Обсуждение можно вести в ветке форума Autodesk или на Revitcity.ru.

среда, 22 июня 2011 г.

Тренинги по Revit API.

19 и 20 июля этого года в Санкт-Петербурге будут проводиться бесплатные тренинги по Revit API. В них и я приму участие. Так же там будет присутствовать Джереми Таммик (как сейчас выяснилось он будет online). Было бы здорово , если те, кто собираются их посетить зададут тут вопросы, которые их больше всего интересуют и я смогу их в большей степени раскрыть. Ну а те, кто еще не знает можете зарегистрироваться и посетить это мероприятие. Буду рад всех видеть!!!

воскресенье, 1 мая 2011 г.

Конкурс для участников САПРяжения.



Стартовал конкурс для участников САПРяжения!

Правила конкурса:

  1. Место проведения конкурса - Autodesk форум
  2. Будут созданы отдельно темы под конкурсные работы (для каждого города, своя тема). И отдельная тема для обсуждения работ.
  3. Область проекта - любая!
  4. Один проект - одно сообщение.
  5. Количество проектов от одного участника не ограничено.
  6. Формат выкладываемых материалов (DWF, PDF, растровые форматы, видео http://rutube.ru/, http://www.youtube.com и т.д.)
  7. Голосование общее, голосовать могут только зарегистрированные пользователи форума -кнопкой - ball.png
  8. Один человек может проголосовать за один проект, только один раз.
  9. Голоса за разные проекты не суммируются. Побеждает тот проект, который набрал максимальное количество баллов.
  10. К участию принимаются проекты, выполненные в продуктах Autodesk.
  11. В конкурсе могут участвовать все зарегистрирован на САПРяжении.
  12. Формат конкурсной работы: Проект + ФИО + e-mail. (Подача проекта любая)
  13. Сроки на приём проектов и проведение голосования - 2 месяца со дня проведения САПРяжения в вашем городе. Для городов (Краснодар, Нижний Новгород и Казань) в которых сапряжения уже прошли, до объявления конкурса, срок 2 месяца с момента объявления конкурса.
  14. Выдача призов - на осеннем форуме. Кто не сможет посетить и для участников из городов Екатеринбург и Тюмень (там САПРяжение пройдет после 3Dфорума), высылается по почте.
  15. Призовой фонд - 13 манипуляторов 3dConnextion - по одному на каждый город!
  16. Главный приз - оплаченная поездка на Осенний 3Dфорум в Москве из любого города. Определяется по максимальному количеству голосов.

Найти свой город можно на этом форуме.

пятница, 15 апреля 2011 г.

Разговорчики....

На форуме Autodesk стартовала ветка, посвященная Revit API. Постараюс в ней отвечать на появившееся вопросы, ну и естественно наиболее полезные сообщения размещать на этом блоге. Процитирую стартовое сообщение ветки:

Доброго времени суток!
Для регистрации дополнения используется файл манифест который находится в папке:

  • Если используется Windows XP: C:\Documents and Settings\All Users\Application Data\Autodesk\Revit\Addins\2011\

  • Если Windows 7: C:\ProgramData\Autodesk\Revit\Addins\2011\

Естественно если у вас Windows установлен на другом диске, то ищете папку там. Файл манифест имеет разширение *.addin.

Вот код, написанный в одном из моих файлов:

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Application">
<Name>Editing</Name>
<Assembly>C:\ProgramData\Autodesk\Revit\AddIns\2011\Editing.dll</Assembly>
<AddInId>76eb700a-2c85-4888-a78d-31429ecae9ef</AddInId>
<FullClassName>Editing.App</FullClassName>
</AddIn>
<AddIn Type="Command">
<Assembly>C:\ProgramData\Autodesk\Revit\AddIns\2011\Editing.dll</Assembly>
<AddInId>a9551912-c6e3-44a6-844d-e4d140c33916</AddInId>
<FullClassName>Editing.Flipped</FullClassName>
<Text>Антиотзеркаливание</Text>
<Description>Возвращает отзеркаленным дверям заложеную в семействе ориентацию Право/лево</Description>
<LongDescription>Описание</LongDescription>
<AvailabilityClassName>Editing.Antimirror.FlippedAviability</AvailabilityClassName>
<VisibilityMode>NotVisibleInFamily</VisibilityMode>
<VisibilityMode>NotVisibleWhenNoActiveDocument</VisibilityMode>
<LanguageType>Unknown</LanguageType>
</AddIn>
</RevitAddIns>

Это не весь код, но я оставил основной. Я выделил цветом то, что нам может пригодиться. Как видно дополнения делятся на две категории. Это Application и Command. Дополнения типа Application запускаются сразу после старта Revit. Command запускается при нажатии кнопки или выборе из списка дополнений во вкладке Надстройки. В тег Assembly у нас заключен путь к файлу дополнения. В теге FullClassName указан путь к классу, с которого стартует наше дополнение. AvailabilityClassName и VisibilityMode управляют доступностью к комманды в том или ином случае. Остальные теги относятся к описанию нашего дополнения.

Думаю для начала хватит.

пятница, 8 апреля 2011 г.

3ds max 2012: Прокси, каким мы его ждали....


Долгое время я ждал, когда в mental ray появится такой же по скорости и милости к оперативной памяти прокси объект. И вот свершилось! Эксперементируя с прокси объектами в новом 2012 3ds max я был приятно удивлен, что наконец-то большое количество прокси не сьедает так много оперативки! Вот моя эксперементальная картинка.
Тут использовались прокси объекты деревьев (2,5 млн полигонов каждое) и кустарники (500 тыс полигонов каждый).
К слову есть еще один плюс для пользователей Revit. Наконец то у нас есть нормальный линк через FBX. Теперь все материалы и обьекты на русском языке отображаются в максе на том же русском и главное читаемом русском! Плюс материалы действительно полностью переносятся с текстурами! Что тут сказать.... Наконец-то!!!!