Пакетное добавление параметров

Главная Форумы Python Revit Library (API) Пакетное добавление параметров

Просмотр 15 сообщений - с 16 по 30 (из 48 всего)
  • Автор
    Сообщения
  • #4582 Score: 0
    Zyado
    Участник

    Hallo , Сергей Кривой
    have you considered revised the python code to bind one parameter to different categories? i am using now Revit 2016
    i am grateful for your support
    thank you

    #4592 Score: 0
    Alexandr Popov
    Модератор
    44 pts

    Hello, see http://dynamobim.ru/cmdownloads/add-shared-parameter-to-project/

    ParameterName(Group in shared parameters,Format,Category1/Category2/…,Group in properties,0)

    where 0 – Type, for Instance – 1

    between parameters in string [enter]

    #6888 Score: 0
    Александр
    Участник
    3 pts

    Коллеги, а как добавить глобальные параметры? С возможностью выбора категорий? кто-то решал такую задачу?

    #7295 Score: 0
    Dmitry Shelyago
    Участник
    1 pt

    А не подскажите, есть ли что-то, что пакетно добавляет общие параметры сразу во много файлов .rvt?

    #7306 Score: 1
    Сергей Кривой
    Модератор
    14 pts

    Здравствуйте!

    Можно попробовать примерно так:

    # Загрузка библиотек
    import clr
    
    clr.AddReference("RevitServices")
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    from RevitServices.Transactions import TransactionManager
    
    clr.AddReference('RevitAPI')
    import Autodesk
    from Autodesk.Revit.DB import *
    
    # Определение текущего документа
    curdoc = DocumentManager.Instance.CurrentDBDocument
    uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
    uiapp = DocumentManager.Instance.CurrentUIApplication
    app = uiapp.Application
    
    # Определение категорий
    categories = doc.Settings.Categories
    
    # Определение файла общих параметров
    file = app.OpenSharedParameterFile()
    
    # Опции сохранения файла
    optS = SaveAsOptions()
    optS.OverwriteExistingFile = True
    optS.MaximumBackups = 1
    
    # На вход Python подаётся список файлов RVT и список параметров со всеми их свойствами
    files = IN[0]
    params = IN[1]
    
    # Функция для создания параметра
    # Подаём имя, группу, группирование, формат, видимость и нужные категории
    
    def paramCreate(_doc, _paramName, _paramGroup, _groupName, _paramType, _visible, _cats):
        group = file.Groups.get_Item(_groupName)
        if group == None:
            group = file.Groups.Create(_groupName)
        if not group.Definitions.Contains(group.Definitions.Item[_paramName]):
            opt = ExternalDefinitionCreationOptions(_paramName, _paramType)
            opt.Visible = _visible
            defin = group.Definitions.Create(opt)
            cats = app.Create.NewCategorySet()
            for cat in _cats:
                cats.Insert(categories.get_Item(BuiltInCategory.cat))
            bind = app.Create.NewInstanceBinding(cats)
            _doc.ParameterBindings.Insert(defin, bind, _paramGroup)
    
    # Запускаем цикл по файлам RVT
    for file in files:
        doc = app.OpenDocumentFile(file)
    
        # Открытие транзакции
        TransactionManager.Instance.EnsureInTransaction(doc)
    
        # Для каждого RVT запускаем цикл по параметрам
        for param in params:
            paramCreate(doc, param[0], param[1], param[2], param[3], param[4], param[5])
    
        # Закрытие транзакции
        TransactionManager.Instance.ForceCloseTransaction()
    
        doc.SaveAs(file, optS)
        doc.Close(0)
    
    OUT = 'Всё нормально'
    #7757 Score: 0
    anchim678
    Участник

    Здравствуйте, пробовал вашу программу в Revit2016 – все хорошо работает. В Revit 2017 вылазит ошибка (рисунок 1), как я понял он говорит, что не существует метода Groups, его нужно как-то изменить?плохо ориентируюсь в API. 

    Рис.1

    #7758 Score: 0
    Семен
    Участник
    5 pts

    Нет, проблема в том, что нет объекта, соответственно нет и Групс. Гдето неверно генерится список или вообще не генерится.

    Но это не точно.

    Смотрите, что обрабатывается на строке 75.

    #7759 Score: 0
    anchim678
    Участник

    Так почему в Revit 2016 тогда все нормально получается. Смотрел список атрибутов file с помощью dir(file), там вообще нет Groups, в Revit 2016  есть.

    #7762 Score: 0
    Семен
    Участник
    5 pts

    Гдето выше надо найти, откуда берется file.
    Выведите в OUT этот file – вангую, что он пустой

    #7764 Score: 0
    kulkul
    Участник
    47 pts

    Hi anchim,

    You could also use Standard OOTB node to create shared parameter inside group.

    #7765 Score: 0
    anchim678
    Участник

    Да вроде нет.

    #7766 Score: 0
    Семен
    Участник
    5 pts

    Дайте весь код на пастебине

    #7767 Score: 0
    anchim678
    Участник

    #Copyright(c) 2015, Konrad Sobon
    # @arch_laboratory, http://archi-lab.net

    import clr
    clr.AddReference(‘ProtoGeometry’)
    from Autodesk.DesignScript.Geometry import *

    # Import DocumentManager and TransactionManager
    clr.AddReference(“RevitServices”)
    import RevitServices
    from RevitServices.Persistence import DocumentManager
    from RevitServices.Transactions import TransactionManager

    # Import RevitAPI
    clr.AddReference(“RevitAPI”)
    import Autodesk
    from Autodesk.Revit.DB import *

    doc = DocumentManager.Instance.CurrentDBDocument
    uiapp = DocumentManager.Instance.CurrentUIApplication
    app = uiapp.Application

    from System.Collections.Generic import *

    # Import ToDSType(bool) extension method
    clr.AddReference(“RevitNodes”)
    import Revit
    clr.ImportExtensions(Revit.Elements)
    import System
    #The inputs to this node will be stored as a list in the IN variable.
    dataEnteringNode = IN

    _paramName = IN[0][0]
    _groupName = IN[0][1]
    _paramType = IN[1]
    _visible = IN[0][3]
    _category = IN[2]
    _paramGroup = IN[3]
    _instance = IN[0][6]

    def ParamBindingExists(_doc, _paramName, _paramType):
    map = doc.ParameterBindings
    iterator = map.ForwardIterator()
    iterator.Reset()
    while iterator.MoveNext():
    if iterator.Key != None and iterator.Key.Name == _paramName and iterator.Key.ParameterType == _paramType:
    paramExists = True
    break
    else:
    paramExists = False
    return paramExists

    def RemoveParamBinding(_doc, _paramName, _paramType):
    map = doc.ParameterBindings
    iterator = map.ForwardIterator()
    iterator.Reset()
    while iterator.MoveNext():
    if iterator.Key != None and iterator.Key.Name == _paramName and iterator.Key.ParameterType == _paramType:
    definition = iterator.Key
    break
    message = None
    if definition != None:
    map.Remove(definition)
    message = “Success”
    return message

    def addParam(doc, _paramName, _visible, _instance, _groupName, _paramGroup,k):
    message = None
    if ParamBindingExists(doc, _paramName, _paramType):
    if not RemoveParamBinding(doc, _paramName, _paramType) == “Success”:
    message = “Param Binding Not Removed Successfully”
    else:
    message = None

    group = file.Groups.get_Item(_groupName)
    if group == None:
    group = file.Groups.Create(_groupName)
    if group.Definitions.Contains(group.Definitions.Item[_paramName]):
    _def = group.Definitions.Item[_paramName]
    else:
    _def = group.Definitions.Create(opt)
    param = doc.ParameterBindings.Insert(_def, bind, _paramGroup)
    return message
    #”Start” the transaction
    TransactionManager.Instance.EnsureInTransaction(doc)

    try:
    file = app.OpenSharedParameterFile()
    except:
    message = “No Shared Parameter file found.”
    pass
    k=0
    while k<_paramName.Count:
    builtInCategory = System.Enum.ToObject(BuiltInCategory, _category[k].Id)
    cats = app.Create.NewCategorySet()
    cats.Insert(doc.Settings.Categories.get_Item(builtInCategory))
    if _instance[k]:
    bind = app.Create.NewInstanceBinding(cats)
    else:
    bind = app.Create.NewTypeBinding(cats)
    opt = ExternalDefinitionCreationOptions(_paramName[k], _paramType[k])
    opt.Visible = _visible[k]
    if isinstance(_paramName[k], list):
    for i in _paramName[k]:
    message = addParam(doc, i, _visible[k], _instance[k], _groupName[k], _paramGroup[k], k)
    else:
    message = addParam(doc, _paramName[k], _visible[k], _instance[k], _groupName[k], _paramGroup[k],k)
    k=k+1

    # “End” the transaction
    TransactionManager.Instance.TransactionTaskDone()

    #Assign your output to the OUT variable

    if message == None:
    OUT = “Success”
    else:
    OUT = message

    #7768 Score: 0
    anchim678
    Участник

    Так вышло, что добавил общий файл параметров проекта и программа выполнилась. И в revit 2016 все работало потому, что там была по умолчанию ссылка на этот файл.

    #7769 Score: 0
    Семен
    Участник
    5 pts

    Логично!

Просмотр 15 сообщений - с 16 по 30 (из 48 всего)
  • Для ответа в этой теме необходимо авторизоваться.