ИваСерж
Ответы в темах
-
АвторСообщения
-
Вот прямо сегодня столкнулся с такой проблемой. Подробней рассказал Лобанов в своих уроках
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. Методами Питона 2.7 (причем урезанными), если встречаем элемент из Динамо, то его надо “развернуть” – Unwrap
2. Методами самого Динамо (т.е. из кода Питона мы можем обращаться к нодам Динамо.В Питоне 2.7 нет метода IndexOf, зато есть нод с таким именем в Динамо. Можете вытащить этот нод и посмотреть как он работает. В коде вы обращаетесь именно к ноду!
Из-за приведенных особенностей часто возникают проблемы с пространствами имен. Я часто путаю Point из Динамо и Point, которую создал в коде посредством АПИ. Как по мне, то Питон в Динамо не достаточно “инкапсулирован” от самого Динамо. Проблемы с пространствами имен встречаются постоянно. Я бы хотел, чтоб работая в Питоне, мы пользовались только методами Питона, а на методы Динамо ссылались как-то по другому. Хотя, думаю, это тоже большой вопрос для программистов.Задача моего скрипта – делить существующие лотки на лотки стандартной длинны 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Д – пока размещаю схемы в модели, а не в чертежном виде. Но, как дойдут руки, доделаю.Писал для Ревита 15. В 17 не тестил
В 17 Ревите нет метода NewPipeCreate.
Надо использовать другой метод. Почитал в хелпе
http://www.revitapidocs.com/2017/04817280-4044-112c-d229-59e8a50b1c95.htmОбщий принцип – самый большой участок кода – рассчет точек, по которым будут строиться новые элементы. Посоздавать по этим точкам трубы и фитинги – дело методов и, как по мне, не является интересным. Дак вот: сначала рассчитываем точки “маршрута”, потом записываем этот маршрут в лист и запихиваем их в нод, который перечисляя эти точки в цикле строит трубы. После создания труб берем с них коннекторы и соединяем между собой фитингами.
Код по ссылке.
Прошу обратить внимание, я складываю стринг со стрингом.К сожалению, Динамо не обладает особой гибкостью. Стены – это встроенные семейства. И получив такую ошибку я понял, что скорее всего нод не может найти это системное семейство. Через 10 секунд поисков я нашел нод WallType.ByName – работает со стенами. Также есть FloorType.ByName…
Вывод – универсального решения нет (что странно).
С выбором типов любого элемента нет проблем через АПИ (Питон)П.С.
Почекал лукапом проекты. Действительно, типы семейств хранятся в разных типах объектов.
Все обычные семейства это объект класса “FamilySymbol”
У встроенных семейств свои классы для хранения типов.
WallType, FloorType, CableTrayType и т.п.
Динамо-нод FamilyType.ByName вытягивает только “FamilySymbol”. Метод АПИ GetTypeID – универсален и может получать доступ к любым объектам, описывающим типы.https://www.dropbox.com/s/f4vdwdur1b18abs/CableTrayDivide.zip?dl=0
Вот работающий скрипт по разделению кабельных лотков.
Только у меня условия деления сложнее. У меня есть лотки 1м, 2м и 3м.
Соответственно я делю лотки на такие отрезки.
Я полностью удаляю старые лотки и по точкам следования старых лотков строю новые.
В точки разреза вставляю фитинги. Т.е. система лотков не разрушается.
Однако, слетят все настройки видимости, все тэги, которые относятся к лоткам и т.п.
Скрипт, как по мне, сложный. Но я его комментировал. Можно разобраться.Округление делается в спецификации а не скриптом, поэтому я не заморачивался.
1. Методы из АПИ выбрать напрямую нельзя. “Выбор” по нормальному, называется “перезагрузка метода”. работает так: в метод по очереди запихивается объект. Если первый метод отработал с ошибкой – объект запихивается во второй метод. И так до тех пор, пока что-то не отработает. Если ни один метод не отработал правильно – выдается ошибка.
2. Из п.1 следует, что для начала нужно привести в порядок объекты, которые подаем в метод. В приведенном на скрине скрипте я сразу вижу ошибки в типах данных, которые подаются в метод. Каждую из ошибок надо рассматривать отдельно и очень внимательно.
2.1 список polycurve должен быть не списком, а коллекцией из .Net Я тут недавно писал о том, как преобразовать список в коллекцию.
2.2 Level – прошу не забывать, что на входе в нод залетает “Динамовский” объект. Его надо развернуть. Для получения “чистого” объекта применяем UnwrapElement
2.3 direct – а вот тут не знаю, что на вводе (надо смотреть скрипт). Скорее всего на вводе объект Point, а метод кушает объект ХYZ (оказывается они разные точка и этот ХУЗ не одно и то же.) . Используем банальное преобразование ХYZ(Point.X, Point.Y, Point.Z).Вывод. Надо привести в порядок объекты, которые подаем в метод. Скорее всего, и дальше будут какие-то ошибки, но прежде всего надо решить очевидные проблемы.
Не совсем понятно, что вы хотите фильтровать. Речь идет о поиске систем и записи в элементы имени системы? Тогда, возможно, следующее решение для вас:
Как вы сами говорите, в систему могут входить
семейства из разных категорий: фитинги, общие модели, смежные объекты…
Вы начинаете скрипт с поиска элементов. Впринципе, можно выбрать все-все элементы и искать к какой системе они относятся, но это слишком много работы для компьютера. Поскольку элементов тысячи, а инженерных систем не так уж и много, я предлагаю начинать скрипт исходя из инженерных систем. В этом нам поможет скрипт Лукап – иметь его обязательно для каждого программиста в Ревит.
Насколько я понял, у вас трубы. Значит для начала выберем все трубопроводные системы.
Итак предлагаю следующий порядок действий:
1. Выбираем все системы труб
2. Поочередно из каждой системы извлекаем элементы системы, а также название системы или любой другой необходимый параметр (у вас “Имя системы”)
3. В каждый элемент системы (не зависимо от категории), записываем в параметр “Группирование” “Имя системы”Я набросал рабочий черновик который извлекает имя системы и элементы системы. С записью в параметры, надеюсь, разберетесь.
https://www.dropbox.com/s/zi4b3jujelroz3f/2018.04.12%20PipeSystemElements.dyn?dl=0
П.С. Файл у меня на дропбоксе. Лежит там, пока мне не надоест. Если файл не скачивается – значит я его безвозвратно удалил.Начинаю записывать видео по скрипту.
Желающие могут посмотреть https://youtu.be/-OgdSa-tMO0
Сам пример и скрипты после завершения серий видео выложу на форум.
Сразу выкладывать не тороплюсь – в процессе видеосъёмки были найдены баги и добавлены новые идеи )) -
АвторСообщения