Legantmar

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

Просмотр 15 сообщений - с 1 по 15 (из 261 всего)
  • Автор
    Сообщения
  • #2723 Score: 7
    Legantmar
    Хранитель
    475 pts

    добавлю своих пару копеек (сделал ранее, но не успел доделать)
    Видео
    Скачать скрипт

    #5963 Score: 6
    Legantmar
    Хранитель
    475 pts

    это конечно уже треш, но в одну строку ))

    from operator import itemgetter
    OUT = zip(*sorted(zip([("").join([i for i in p if i.isalpha()]) for p in [i.split(".")[0] for i in IN[0]]], [int(("").join([i for i in p if i.isdigit()])) for p in [i.split(".")[0] for i in IN[0]]], [int(i.split(".")[1]) for i in IN[0]], IN[0]), key=itemgetter(0,1,2)))[3]

    p.s. не зависит от количества букв в префиксе и сортирует по алфавиту

    update: для тех, кто хочет разобраться в коде выше, переписал в нормальном виде с комментариями

    #5659 Score: 6
    Legantmar
    Хранитель
    475 pts

    Совет:
    из-за использования записи вида:
    from Autodesk.Revit.DB import *
    и
    from DSCore import *
    может возникать конфликт для элементов с одинаковыми именами, например Color (ошибка AttributeError: ‘type’ object has no attribute ‘ByARGB’)
    т.к. есть Autodesk.Revit.DB.Color – это цвет Revit
    и есть DSCore.Color – это цвет Dynamo и они не равнозначны.

    В этом случае можно использовать следующие приемы:
    1) либо в теле кода указывать элементы с полными путями, типа colorRevit = Autodesk.Revit.DB.Color(0xFF, 0x00, 0x00 )
    2) либо предварительно импортировать элемент как import Autodesk.Revit.DB.Color as rColor
    и тогда таже строчка colorRevit = rColor(0xFF, 0x00, 0x00 ) – цвет ревита

    p.s. такие же ошибки могут быть и при
    from Autodesk.Revit.DB import * # импорт из Revit API
    и
    from Revit.Elements import * # импорт из RevitNodes
    и др.
    С одной стороны вы упрощаете дальнейшее использование элементов (не таская длинные полные пути), но с другой нужно помнить о том, что имя вашего элемента может быть одновременно в нескольких библиотеках.

    #2183 Score: 5
    Legantmar
    Хранитель
    475 pts


    Special thanks for Dimitar Venkov.
    Скачать скрипт
    p.s. стены должны быть параллельны друг другу и лежать в плоскости X или Y, кому нужны размеры для стен расположенных под углом к оси X (или Y), скажите.

    #8229 Score: 5
    Legantmar
    Хранитель
    475 pts

    #5658 Score: 5
    Legantmar
    Хранитель
    475 pts

    Для новичков несколько пояснений по библиотекам в шаблоне.

    # Подключение библиотеки Revit API для работы с элементами Revit'a
    clr.AddReference('RevitAPI') # RevitAPI.dll лежит как правило здесь C:\Program Files\Autodesk\Revit 2017
    import Autodesk
    from Autodesk.Revit.DB import * # импорт всех элементов, если к примеру нужны только стены, то * заменяется на Wall
    import sys
    pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib' # добавление пути к директории IronPython для использования его библиотек
    sys.path.append(pyt_path)
    # Использование библиотеки ProtoGeometry для геометрических фигур (точки, линии, окружности, дуги, кривые и пр.)
    clr.AddReference('ProtoGeometry') # ProtoGeometry.dll лежит здесь C:\Program Files\Dynamo\Dynamo Core\1.3
    from Autodesk.DesignScript.Geometry import *
    # Использование библиотеки DSCoreNodes (основные ноды расположенные на вкладке библиотеки слева в разделе Core)
    clr.AddReference("DSCoreNodes") # DSCoreNodes.dll лежит здесь C:\Program Files\Dynamo\Dynamo Core\1.3
    import DSCore
    clr.ImportExtensions(DSCore)
    from DSCore import *
    # Упрощенные ноды для работы с объектами Revit
    clr.AddReference("RevitNodes") # RevitNodes.dll лежит здесь C:\Program Files\Dynamo\Dynamo Revit\1.3\Revit_2017
    import Revit
    clr.ImportExtensions(Revit.Elements)
    from Revit.Elements import *
    clr.ImportExtensions(Revit.GeometryConversion) # позволяет конвертировать величины
    clr.ImportExtensions(Revit.GeometryReferences)
    # Для использования транзакций и работе с документом (doc)
    clr.AddReference("RevitServices") # RevitServices.dll лежит здесь C:\Program Files\Dynamo\Dynamo Revit\1.3\Revit_2017
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    from RevitServices.Transactions import TransactionManager
    doc = DocumentManager.Instance.CurrentDBDocument
    uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
    uiapp=DocumentManager.Instance.CurrentUIApplication
    app = uiapp.Application
    # Для работы с Excel из питона (если вы не используете сторонние пакеты)
    clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
    from Microsoft.Office.Interop import Excel
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo("en-US")
    from System.Runtime.InteropServices import Marshal
    # в некоторых случаях, при "глубоком погружении" в Revit API, нужны системные массивы System Array
    import System
    from System import Array
    from System.Collections.Generic import *
    # Прочие библиотеки
    import math # работа с математическими функциями (cos, sin, pi и пр.)
    import random # генерация случайных чисел
    import re # работа с регулярными выражениями

    но лучше их записывать как:
    from math import *
    в этом случае не нужно будет таскать приставку math.pi, а можно сразу использовать pi

    Для того чтобы не писать постоянно UnwrapElement() рекомендую использовать в шаблоне функцию:

    Если вы не знаете сколько будете подавать на вход элементов 1 или несколько, то рекомендую использовать вот эту запись:

    p.s. Вам не обязательно записывать все библиотеки в вашем скрипте, используйте только те, что вы используете для вашего скрипта.

    Ниже состав некоторых часто используемых библиотек:
    Protogeometry

    DSCoreNodes


    RevitNodes

    Revit Nodes продолжение

    #8052 Score: 4
    Legantmar
    Хранитель
    475 pts

    Если я правильно понял

    #4003 Score: 4
    Legantmar
    Хранитель
    475 pts

    прошло много времени с создания первой “версии” шаблончика и пора представить шаблончик v.0.2

    внутри можно найти несколько полезных, часто используемых команд и почти исчерпывающий список подключаемых библиотек

    можно использовать как есть, но для конкретных задач лучше удалять неиспользуемые библиотеки

    #4620 Score: 4
    Legantmar
    Хранитель
    475 pts

    Flatten в python

    #5801 Score: 4
    Legantmar
    Хранитель
    475 pts

    Пару слов для понимания (пригодится другим)

    ВАРИАНТ 1
    OUT = UnwrapElement(IN[0]).Location.Curve.ToProtoType().StartPoint # Получение точки через преобразование к линии динамо
    В этой строчке разворачивается входной элемент UnwrapElement(IN[0]) (для доступа к основным свойствам).
    Через команду Location получаем расположение элемента (для протяженных элементов, таких как стены, трубы и пр. это будет линия (curve), для элементов типа колонна это будет точка)
    ToProtoType() – преобразуем в элемент динамо (в данном случае преобразовали линию ревита в линию динамо)
    и дальше по аналогии с одноименным нодом находим стартовую точку StartPoint.
    Можем получить, например, координату X, с помощью записи OUT = UnwrapElement(IN[0]).Location.Curve.ToProtoType().StartPoint.X – значение в мм.!!

    ВАРИАНТ 2

    OUT = UnwrapElement(IN[0]).Location.Curve.GetEndPoint(0) # Получение XYZ не путать с точкой при этом не нужны никакие библиотеки (revitapi подхватывается “на подсознательном уровне динамо”)
    Если нужно получить координату X, то запись будет вида OUT = UnwrapElement(IN[0]).Location.Curve.GetEndPoint(0).X
    Обращаю внимание, что размер будет в футах!! и для перевода  в мм нужно умножить на 304,8
    Т.е. окончательная запись будет: OUT = UnwrapElement(IN[0]).Location.Curve.GetEndPoint(0).X *304.8

    Приведенные выше варианты равнозначны (на форуме можно найти применение обоих).

    p.s. до недавнего времени я пользовался первым вариантом, т.к. все команды перекликаются с одноименными нодами динамо, что интуитивно понятнее, но если “уходить от динамо”, то использовать нужно второй вариант.

    #2629 Score: 4
    Legantmar
    Хранитель
    475 pts

    KhonVlad, вот так можно:

    p.s. для номера помещения нужно заменить “Имя” на “Номер” ))

    Этот прием работает не только со светильниками но и с другими элементами (двери, окна, мебель и пр.), достаточно поменять категорию.

    #6852 Score: 4
    Legantmar
    Хранитель
    475 pts

    еще раз в дополнении к http://dynamobim.ru/forums/topic/tips-and-trics-советы-и-приемы/page/4/#post-5082

    if else в генераторе
    пример:

    lst = [1,2,3,4,5,6]
    collection = ["ok" if d == 3 else 0 for d in lst]

    >> [0, 0, ‘ok’, 0, 0, 0]

    #7455 Score: 4
    Legantmar
    Хранитель
    475 pts

    Артем добавил в раздел скачать
    http://dynamobim.ru/cmdownloads/авторазмер-между-стенами-и-осями-2018/

    Для тех кому интересно, рассказываю (правильную табуляцию смотрите в коде по ссылке выше).
    1) если вы импортируете библиотеку ProtoGeometry как:
    clr.AddReference(‘ProtoGeometry’)
    from Autodesk.DesignScript.Geometry import *
    то далее у вас будут конфликты с Reference (типа invalid number of references )
    решение:
    clr.AddReference(‘ProtoGeometry’)
    import Autodesk.DesignScript.Geometry as ge  # (чтобы различать библиотеки)
    и далее в скрипте использовать, например, line= ge.Line.ByStartPointEndPoint(pt0,pt1).ToRevitType()

    2) Немного по другому стали доставаться эти самые референсы
    для осей (grids):
    for grid in grids:
    for obj in grid.get_Geometry(opt):
    if isinstance(obj, Line):
    gline = obj
    Ref.Append(gline.Reference)

    для стен (wall) внешние плоскости:
    for element in walls:
    a = HostObjectUtils.GetSideFaces(element, ShellLayerType.Exterior)
    for i in a:
    Ref.Append(i)
    b = HostObjectUtils.GetSideFaces(element, ShellLayerType.Interior)
    for i in b:
    Ref.Append(i)

    спасибо за помощь kulkul

    #6130 Score: 3
    Legantmar
    Хранитель
    475 pts

    txt, почти правильно
    т.к. существуют:
    FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements()
    FilteredElementCollector(doc).OfClass(Wall).ToElements()
    такие записи идентичны, например, на выходе ты получишь элементы стен расположенных в проекте

    Но верхнюю строчку можно переписать и так:
    FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsElementType().ToElements()
    тогда получишь только типы элементов в файле без элементов размещенных в проекте.

    Подробнее здесь
    Путем нехитрых манипуляций можно получать BuiltIn по имени категории

    #6894 Score: 3
    Legantmar
    Хранитель
    475 pts

    Если речь идет про имена материалов разных слоев, то вот так:

     

    import clr
    clr.AddReference('RevitAPI')
    from Autodesk.Revit.DB import *
    
    clr.AddReference("RevitServices")
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    doc = DocumentManager.Instance.CurrentDBDocument
    
    str = UnwrapElement(IN[0]).WallType.GetCompoundStructure()
    num = str.LayerCount
    layersName = []
    for i in range(num):
        layersName.append(doc.GetElement(str.GetMaterialId(i)).Name)
    
    OUT = layersName

    Код можно немного сократить (но не забыть про подключаемые библиотеки)
    str = UnwrapElement(IN[0]).WallType.GetCompoundStructure()
    OUT = [doc.GetElement(str.GetMaterialId(i)).Name for i in range(str.LayerCount)]

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