ИваСерж

Ответы в темах

Просмотр 15 сообщений - с 1 по 15 (из 98 всего)
  • Автор
    Сообщения
  • #4843 Score: 4
    ИваСерж
    Хранитель
    134 pts

    Вот прямо сегодня столкнулся с такой проблемой. Подробней рассказал Лобанов в своих уроках

    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 не будет отслеживать и при каждом запуске будут создаваться новые элементы, старые удаляться не будут.

     

    #8643 Score: 3
    ИваСерж
    Хранитель
    134 pts

    Суть вопроса как понимаю я:
    Для программирования в Ревит мы используем АПИ. Динамо это “обертка” (красивая оболочка) над этим АПИ. Питон, встроенный в Динамо – это очередная “обёртка”, но уже для Динамо. Получаем, как лук, завернутые друг в друга программные элементы. По сути, Ревит это “обертка” надо операционной системой. Операционная система – “обертка” над драйверами, драйверы – “обертка” для железа.

    Работая в Питоне мы можем пользоваться:
    1. Методами Питона 2.7 (причем урезанными), если встречаем элемент из Динамо, то его надо “развернуть” – Unwrap
    2. Методами самого Динамо (т.е. из кода Питона мы можем обращаться к нодам Динамо.

    В Питоне 2.7 нет метода IndexOf, зато есть нод с таким именем в Динамо. Можете вытащить этот нод и посмотреть как он работает. В коде вы обращаетесь именно к ноду!
    Из-за приведенных особенностей часто возникают проблемы с пространствами имен. Я часто путаю Point из Динамо и Point, которую создал в коде посредством АПИ. Как по мне, то Питон в Динамо не достаточно “инкапсулирован” от самого Динамо. Проблемы с пространствами имен встречаются постоянно. Я бы хотел, чтоб работая в Питоне, мы пользовались только методами Питона, а на методы Динамо ссылались как-то по другому. Хотя, думаю, это тоже большой вопрос для программистов.

    #7894 Score: 3
    ИваСерж
    Хранитель
    134 pts

    Могу только на питоне.
    В ИН0 – подаем список панелей
    В ИН1- подаем список координат.

    На выходе отсортированные панели.

    panelsList = IN[0]
    coordZlist = IN[1]

    ziped = zip(panelsList,coordZlist)
    ziped.sort(key=lambda x: x[1])
    outlist = [i[0] for i in ziped]

    OUT = outlist

    #8673 Score: 3
    ИваСерж
    Хранитель
    134 pts

    У нас не 3 питон, а 2.7
    я бы написал через генератор списков
    a = [1,3,5,7]
    b = [i*2 for i in a]
    OUT = b

    Можно через лямбду и мап
    a = [1,3,5,7]
    func = lambda x: x*2
    b = map(func, a)
    OUT = b

    #9292 Score: 3
    ИваСерж
    Хранитель
    134 pts

    Задача моего скрипта – делить существующие лотки на лотки стандартной длинны 1.5 м.
    Для этого я отфильтровываю все лотки, которые короче 1.5 м
    Затем вычисляю точки для новых лотков.
    Удаляю старые лотки.
    По точкам черчу новые лотки.
    Новые лотки соединяю. При этом автоматически воссоздаются коннекторы.
    Скрипт полностью рабочий.
    https://www.dropbox.com/s/f4vdwdur1b18abs/CableTrayDivide.zip?dl=0

    П.С. код, конечно, не очень удачный… Скрипт 16 года) Читаю код и хочу его теперь полностью переписать)

    #8700 Score: 3
    ИваСерж
    Хранитель
    134 pts

    http://dynamobim.ru/cmdownloads/%d1%8d%d0%bb%d0%b5%d0%ba%d1%82%d1%80%d0%be%d1%82%d0%b5%d1%85%d0%bd%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b9-%d1%80%d0%b0%d1%81%d1%87%d1%91%d1%82/

    Закончил обещаный скрипт по расчёту электрики. Тест-проект прикладываю. Записывать видео лень. Кому надо – спрашивайте. Скрипт написан под мой собственный БИМ стандарт. Прошел тесты на небольших проектах, но глобально не проверялся.

    #4234 Score: 3
    ИваСерж
    Хранитель
    134 pts

    Пример с динамо скриптом

    http://dynamobim.ru/cmdownloads/%D1%80%D0%B0%D1%81%D1%87%D1%91%D1%82-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D0%BA%D0%B8%D1%85-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D0%BE%D0%B2-%D1%81%D0%BE%D0%B7%D0%B4/

    Видео как работает. Правда, до конца так и не записал из-за отсутсвтия интереса.
    https://www.youtube.com/watch?v=-OgdSa-tMO0&list=PLXoMzi7DFVEZ9LfSdxDtba6bFMjA2d7vq

    На данный момент переработана  рассчётная часть скрипта. Добавлены контакторы и т.п.
    Не доделанными остаются 2Д  – пока размещаю схемы в модели, а не в чертежном виде. Но, как дойдут руки, доделаю.

    #8365 Score: 2
    ИваСерж
    Хранитель
    134 pts

    https://www.dropbox.com/s/f4vdwdur1b18abs/CableTrayDivide.zip?dl=0

    Вот работающий скрипт по разделению кабельных лотков.
    Только у меня условия деления сложнее. У меня есть лотки 1м, 2м и 3м.
    Соответственно я делю лотки на такие отрезки.
    Я полностью удаляю старые лотки и по точкам следования старых лотков строю новые.
    В точки разреза вставляю фитинги. Т.е. система лотков не разрушается.
    Однако, слетят все настройки видимости, все тэги, которые относятся к лоткам и т.п.
    Скрипт, как по мне, сложный. Но я его комментировал. Можно разобраться.

    Округление делается в спецификации а не скриптом, поэтому я не заморачивался.

    #7192 Score: 2
    ИваСерж
    Хранитель
    134 pts

    1. Методы из АПИ выбрать напрямую нельзя. “Выбор” по нормальному, называется “перезагрузка метода”. работает так: в метод по очереди запихивается объект. Если первый метод отработал с ошибкой – объект запихивается во второй метод. И так до тех пор, пока что-то не отработает. Если ни один метод не отработал правильно – выдается ошибка.

    2. Из п.1 следует, что для начала нужно привести в порядок объекты, которые подаем в метод. В приведенном на скрине скрипте я сразу вижу ошибки в типах данных, которые подаются в метод. Каждую из ошибок надо рассматривать отдельно и очень внимательно.
    2.1 список polycurve должен быть не списком, а коллекцией из .Net Я тут недавно писал о том, как преобразовать список в коллекцию.
    2.2 Level – прошу не забывать, что на входе в нод залетает “Динамовский” объект. Его надо развернуть. Для получения “чистого” объекта применяем UnwrapElement
    2.3 direct – а вот тут не знаю, что на вводе (надо смотреть скрипт). Скорее всего на вводе объект Point, а метод кушает объект ХYZ (оказывается они разные точка и этот ХУЗ не одно и то же.) . Используем банальное преобразование  ХYZ(Point.X, Point.Y, Point.Z).

    Вывод. Надо привести в порядок объекты, которые подаем в метод. Скорее всего, и дальше будут какие-то ошибки, но прежде всего надо решить очевидные проблемы.

    #7888 Score: 2
    ИваСерж
    Хранитель
    134 pts

    Не совсем понятно, что вы хотите фильтровать. Речь идет о поиске систем и записи в элементы имени системы? Тогда, возможно, следующее решение для вас:
    Как вы сами говорите, в систему могут входить
    семейства из разных категорий: фитинги, общие модели, смежные объекты…
    Вы начинаете скрипт с поиска элементов. Впринципе, можно выбрать все-все элементы и искать к какой системе они относятся, но это слишком много работы для компьютера. Поскольку элементов тысячи, а инженерных систем не так уж и много, я предлагаю начинать скрипт исходя из инженерных систем. В этом нам поможет скрипт Лукап – иметь его обязательно для каждого программиста в Ревит.
    Насколько я понял, у вас трубы. Значит для начала выберем все трубопроводные системы.
    Итак предлагаю следующий порядок действий:
    1. Выбираем все системы труб
    2. Поочередно из каждой системы извлекаем элементы системы, а также название системы или любой другой необходимый параметр (у вас “Имя системы”)
    3. В каждый элемент системы (не зависимо от категории), записываем в параметр “Группирование” “Имя системы”

    Я набросал рабочий черновик который извлекает имя системы и элементы системы. С записью в параметры, надеюсь, разберетесь.
    https://www.dropbox.com/s/zi4b3jujelroz3f/2018.04.12%20PipeSystemElements.dyn?dl=0
    П.С. Файл у меня на дропбоксе. Лежит там, пока мне не надоест. Если файл не скачивается – значит я его безвозвратно удалил.

    #4568 Score: 2
    ИваСерж
    Хранитель
    134 pts

    А вот и результаты проверки.
    Все работает.
    В этом скрипте меняю штамп всем листам, которые содержат имя План на штамп на А0.
    Вы можете отфильтровать нужные себе штампы по параметру “Имя листа” или по всем остальным доступным параметрам.

    #3772 Score: 2
    ИваСерж
    Хранитель
    134 pts

    Начинаю записывать видео по скрипту.
    Желающие могут посмотреть https://youtu.be/-OgdSa-tMO0
    Сам пример и скрипты после завершения серий видео выложу на форум.
    Сразу выкладывать не тороплюсь – в процессе видеосъёмки были найдены баги и добавлены новые идеи ))

    #4844 Score: 2
    ИваСерж
    Хранитель
    134 pts

    Тамика читал?

    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.
    #6474 Score: 2
    ИваСерж
    Хранитель
    134 pts

    Алекс, я пользуюсь методом из АПИ IsPointInRoom.
    Для определения, находится ли семейство в комнате, я извлекаю его LocationPoint.
    http://www.revitapidocs.com/2015/96e29ddf-d6dc-0c40-b036-035c5001b996.htm
    Беру комнату и проверяю, попадает ли LocationPoint в комнату или нет.
    Поскольку конфигурация моих семейств такая, что LocationPoint однозначно определяет, есть ли семейство в помещении или нет, то у меня и проблем нет. Из приемуществ метода – метод работает с любой сложной конфигурацией помещений – круглые, атриумы, с составными стенами и т.п. Из недостатков – Локейш Поинт это все-таки не семейство.

    Для улучшения скорости можно, даже нужно, применять несколько фильтров, по этажу и Баундинг бокс Интерсектс как предварительный фильтр, ИзИнРум – фильтр для уточнения результатов.

     

    #7551 Score: 2
    ИваСерж
    Хранитель
    134 pts

    Забахал фильтр по сравнению координат точек начала-конца линии.
    Впринципе, должно работать. Потестил на 2х линиях.

    https://pastebin.com/fcNNW6Ba

Просмотр 15 сообщений - с 1 по 15 (из 98 всего)