ИваСерж
Ответы в темах
-
АвторСообщения
-
Вот прямо сегодня столкнулся с такой проблемой. Подробней рассказал Лобанов в своих уроках
https://youtu.be/XIGpuP23k9k?list=PLVCDzVIlOckHsZcqkq3DmzdGcq2503l1G&t=1175
Решение: создавать элементы не средствами Динамо, с через питон.
Я использовал команду doc.Create.NewFamilyinstance. Тогда семейства создаются без привязки к Динамо. Если нужно, могу подсказать как работать с NewFamilyinstance.p.s.
import Revit
clr.ImportExtensions(Revit.Elements)Element.ToDSType(False) – если мы создали элемент в Dynamo (и его не было в Revit) – Dynamo будет отслеживать. Т.е. при очередном запуске старый элемент будет удаляться и создаваться новый!
Element.ToDSType(True) – Dynamo не будет отслеживать и при каждом запуске будут создаваться новые элементы, старые удаляться не будут.
Задача моего скрипта – делить существующие лотки на лотки стандартной длинны 1.5 м.
Для этого я отфильтровываю все лотки, которые короче 1.5 м
Затем вычисляю точки для новых лотков.
Удаляю старые лотки.
По точкам черчу новые лотки.
Новые лотки соединяю. При этом автоматически воссоздаются коннекторы.
Скрипт полностью рабочий.
https://www.dropbox.com/s/f4vdwdur1b18abs/CableTrayDivide.zip?dl=0П.С. код, конечно, не очень удачный… Скрипт 16 года) Читаю код и хочу его теперь полностью переписать)
Закончил обещаный скрипт по расчёту электрики. Тест-проект прикладываю. Записывать видео лень. Кому надо – спрашивайте. Скрипт написан под мой собственный БИМ стандарт. Прошел тесты на небольших проектах, но глобально не проверялся.
Пример с динамо скриптом
Видео как работает. Правда, до конца так и не записал из-за отсутсвтия интереса.
https://www.youtube.com/watch?v=-OgdSa-tMO0&list=PLXoMzi7DFVEZ9LfSdxDtba6bFMjA2d7vqНа данный момент переработана рассчётная часть скрипта. Добавлены контакторы и т.п.
Не доделанными остаются 2Д – пока размещаю схемы в модели, а не в чертежном виде. Но, как дойдут руки, доделаю.Суть вопроса как понимаю я:
Для программирования в Ревит мы используем АПИ. Динамо это “обертка” (красивая оболочка) над этим АПИ. Питон, встроенный в Динамо – это очередная “обёртка”, но уже для Динамо. Получаем, как лук, завернутые друг в друга программные элементы. По сути, Ревит это “обертка” надо операционной системой. Операционная система – “обертка” над драйверами, драйверы – “обертка” для железа.Работая в Питоне мы можем пользоваться:
1. Методами Питона 2.7 (причем урезанными), если встречаем элемент из Динамо, то его надо “развернуть” – Unwrap
2. Методами самого Динамо (т.е. из кода Питона мы можем обращаться к нодам Динамо.В Питоне 2.7 нет метода IndexOf, зато есть нод с таким именем в Динамо. Можете вытащить этот нод и посмотреть как он работает. В коде вы обращаетесь именно к ноду!
Из-за приведенных особенностей часто возникают проблемы с пространствами имен. Я часто путаю Point из Динамо и Point, которую создал в коде посредством АПИ. Как по мне, то Питон в Динамо не достаточно “инкапсулирован” от самого Динамо. Проблемы с пространствами имен встречаются постоянно. Я бы хотел, чтоб работая в Питоне, мы пользовались только методами Питона, а на методы Динамо ссылались как-то по другому. Хотя, думаю, это тоже большой вопрос для программистов.Начинаю записывать видео по скрипту.
Желающие могут посмотреть https://youtu.be/-OgdSa-tMO0
Сам пример и скрипты после завершения серий видео выложу на форум.
Сразу выкладывать не тороплюсь – в процессе видеосъёмки были найдены баги и добавлены новые идеи ))Тамика читал?
http://thebuildingcoder.typepad.com/blog/2015/04/whats-new-in-the-revit-2016-api.html#4.01
- All NewFamilyInstance() overloads on Autodesk.Revit.Creation.Document and Autodesk.Revit.Creation.ItemFactoryBase now check to ensure that the input FamilySymbol is active (FamilySymbol.IsActive). Symbols that are not used in the document may be deactivated to conserve memory and regeneration time. When the symbol is inactive, its geometry is empty and cannot be accessed. In order to access the geometry of a symbol that is not active in the document, the symbol should first be activated by calling FamilySymbol.Activate().
- If the symbol is not active the method will now throw. This prevents the situation where the new FamilyInstance created will not generate proper geometry or intersections with related elements.
Алекс, я пользуюсь методом из АПИ IsPointInRoom.
Для определения, находится ли семейство в комнате, я извлекаю его LocationPoint.
http://www.revitapidocs.com/2015/96e29ddf-d6dc-0c40-b036-035c5001b996.htm
Беру комнату и проверяю, попадает ли LocationPoint в комнату или нет.
Поскольку конфигурация моих семейств такая, что LocationPoint однозначно определяет, есть ли семейство в помещении или нет, то у меня и проблем нет. Из приемуществ метода – метод работает с любой сложной конфигурацией помещений – круглые, атриумы, с составными стенами и т.п. Из недостатков – Локейш Поинт это все-таки не семейство.Для улучшения скорости можно, даже нужно, применять несколько фильтров, по этажу и Баундинг бокс Интерсектс как предварительный фильтр, ИзИнРум – фильтр для уточнения результатов.
Забахал фильтр по сравнению координат точек начала-конца линии.
Впринципе, должно работать. Потестил на 2х линиях.Я понял, что мне не нравится в сообщении.
Уж очень оно смахивает на хвастовство.
Хотелось бы видеть не скрин-шот, а нормальное техническое описание или даже лучше сам скрипт.
Что было сделано, как работает, при каких условиях.
Я распространяю свои скрипты расчёта “свободно”, поскольку уже ни для кого не секрет, как рассчитать электрику, однако есть ряд сложных вопросов.Для меня сложный вопрос, который был решен через “костыли” – это получение расчётной нагрузки.
Связано это с тем, что “Расчётная нагрузка” – это параметр, который находится в щите, а не в цепи. Для получения расчётной нагрузки именно в линии я придумал такой алгоритм:
1. Создать вспомогательный щит
2. На вспомогательный щит подключить исследуемую цепь.
3. С вспомогательного щита считать параметр расчётной нагрузки
4. Вернуть цепь обратно в тот щит, в который была раньше подключена
5. Удалить вспомогательный щит.Подобных хитростей реализации у меня много. Хотелось бы посмотреть, как другие люди работают.
А с хвастаться скрин-шотами не надо.Вставляется как обычное семейство.
1. Без хоста по точке NewFamilyInstance Method (XYZ, FamilySymbol, StructuralType)
2. С хостом (стеной) NewFamilyInstance Method (XYZ, FamilySymbol, Element, StructuralType)
3. Почитать подобный скрипт можно тут http://spiderinnet.typepad.com/blog/2013/05/in-revit-net-api-2013-though-the-newwall-method-has-been-moved-to-the-wall-class-itself-the-familyinstance-generation-meth.htmlПараметры удаляются через FamilyManager. Метод RemoveParameter
http://www.revitapidocs.com/2015/cb266197-b76e-66db-ea15-2cf14bcb4f85.htm
- Основная идея такая:
1.1. Открыть семейство по пути на диске
1.2. Найти параметр
1.3. Удалить параметр
1.4. Сохранить семейство.
2. Если надо удалить параметры из семейств, которые уже подгружены в проект:
2.1. Найти семейство в проекте и сохранить его на диск по какому-то временному пути.
2.2. Сделать действия из п.1
2.3 Загрузить семейство по указанному пути в проект.
Пункт 2 однако, требует больших затрат. Поэтому мы решили отказаться от удаления параметров в уже текущих проектах
Ну и пример (как есть) – работал на Ревите 2015.https://www.dropbox.com/s/2jnrm112zc8dkxx/DeleteParamFromRFA.dyn?dl=0
У меня все получилось и работает.
Прошу применять.
https://pastebin.com/yYgsaaZF -
АвторСообщения