ИваСерж

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

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

     

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

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

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

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

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

    #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

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

    Я понял, что мне не нравится в сообщении.
    Уж очень оно смахивает на хвастовство.
    Хотелось бы видеть не скрин-шот, а нормальное техническое описание или даже лучше сам скрипт.
    Что было сделано, как работает, при каких условиях.
    Я распространяю свои скрипты расчёта “свободно”, поскольку уже ни для кого не секрет, как рассчитать электрику, однако есть ряд сложных вопросов.

    Для меня сложный вопрос, который был решен через “костыли” – это получение расчётной нагрузки.
    Связано это с тем, что “Расчётная нагрузка” – это параметр, который находится в щите, а не в цепи. Для получения расчётной нагрузки именно в линии я придумал такой алгоритм:
    1. Создать вспомогательный щит
    2. На вспомогательный щит подключить исследуемую цепь.
    3. С вспомогательного щита считать параметр расчётной нагрузки
    4. Вернуть цепь обратно в тот щит, в который была раньше подключена
    5. Удалить вспомогательный щит.

    Подобных хитростей реализации у меня много. Хотелось бы посмотреть, как другие люди работают.
    А с хвастаться скрин-шотами не надо.

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

    Вставляется как обычное семейство.
    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

     

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

    Параметры удаляются через FamilyManager. Метод RemoveParameter
    http://www.revitapidocs.com/2015/cb266197-b76e-66db-ea15-2cf14bcb4f85.htm

    1. Основная идея такая:
      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

     

     

     

     

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

    У меня все получилось и работает.
    Прошу применять.
    https://pastebin.com/yYgsaaZF

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