ИваСерж

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

Просмотр 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Д  – пока размещаю схемы в модели, а не в чертежном виде. Но, как дойдут руки, доделаю.

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

    Писал для Ревита 15. В 17 не тестил

    https://www.dropbox.com/s/tr3m0u6fkzmenhy/2016.08.05%20%D0%A1%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%82%D1%80%D1%83%D0%B1%D1%8B.rar?dl=0

    В 17 Ревите нет метода NewPipeCreate.
    Надо использовать другой метод. Почитал в хелпе
    http://www.revitapidocs.com/2017/04817280-4044-112c-d229-59e8a50b1c95.htm

    Общий принцип – самый большой участок кода – рассчет точек, по которым будут строиться новые элементы. Посоздавать по этим точкам трубы и фитинги – дело методов и, как по мне, не является интересным. Дак вот: сначала рассчитываем точки “маршрута”, потом записываем этот маршрут в лист и запихиваем их в нод, который перечисляя эти точки в цикле строит трубы. После создания труб берем с них коннекторы и соединяем между собой фитингами.

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

    Код по ссылке.
    Прошу обратить внимание, я складываю стринг со стрингом.

    https://pastebin.com/GLzu3eNh

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

    К сожалению, Динамо не обладает особой гибкостью. Стены – это встроенные семейства. И получив такую ошибку я понял, что скорее всего нод не может найти это системное семейство. Через 10 секунд поисков я нашел нод WallType.ByName – работает со стенами. Также есть FloorType.ByName…
    Вывод – универсального решения нет (что странно).
    С выбором типов любого элемента нет проблем через АПИ (Питон)

    П.С.
    Почекал лукапом проекты. Действительно, типы семейств хранятся в разных типах объектов.
    Все обычные семейства это объект класса “FamilySymbol”
    У встроенных семейств свои классы для хранения типов.
    WallType, FloorType, CableTrayType и т.п.
    Динамо-нод FamilyType.ByName вытягивает только “FamilySymbol”. Метод АПИ GetTypeID – универсален и может получать доступ к любым объектам, описывающим типы.

    #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
    Сам пример и скрипты после завершения серий видео выложу на форум.
    Сразу выкладывать не тороплюсь – в процессе видеосъёмки были найдены баги и добавлены новые идеи ))

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