Пакетное добавление параметров
Главная › Форумы › Python › Revit Library (API) › Пакетное добавление параметров
- В этой теме 47 ответов, 14 участников, последнее обновление 5 лет, 2 месяца назад сделано
Denver-22.
-
АвторСообщения
-
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 youHello, 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]
Коллеги, а как добавить глобальные параметры? С возможностью выбора категорий? кто-то решал такую задачу?
А не подскажите, есть ли что-то, что пакетно добавляет общие параметры сразу во много файлов .rvt?
Здравствуйте!
Можно попробовать примерно так:
# Загрузка библиотек 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 = 'Всё нормально'
anchim678
УчастникЗдравствуйте, пробовал вашу программу в Revit2016 – все хорошо работает. В Revit 2017 вылазит ошибка (рисунок 1), как я понял он говорит, что не существует метода Groups, его нужно как-то изменить?плохо ориентируюсь в API.
Рис.1
Нет, проблема в том, что нет объекта, соответственно нет и Групс. Гдето неверно генерится список или вообще не генерится.
Но это не точно.
Смотрите, что обрабатывается на строке 75.
anchim678
УчастникТак почему в Revit 2016 тогда все нормально получается. Смотрел список атрибутов file с помощью dir(file), там вообще нет Groups, в Revit 2016 есть.
Гдето выше надо найти, откуда берется file.
Выведите в OUT этот file – вангую, что он пустойHi anchim,
You could also use Standard OOTB node to create shared parameter inside group.
anchim678
УчастникДа вроде нет.
Дайте весь код на пастебине
anchim678
Участник#Copyright(c) 2015, Konrad Sobon
# @arch_laboratory, http://archi-lab.netimport 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.Applicationfrom 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 paramExistsdef 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 messagedef 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 = Nonegroup = 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 = messageanchim678
УчастникТак вышло, что добавил общий файл параметров проекта и программа выполнилась. И в revit 2016 все работало потому, что там была по умолчанию ссылка на этот файл.
Логично!
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.