Нашел, где встречал это – Квартирография RVT17 (строка 27) для шаблона АР Autodesk
Если делаю аналог кода упрощенно, то питон выдает ошибку, что объект list не содержит атрибута IndexOf, хотя в скрипте квартирографии это работает.
буду рад любому объяснению
Здравствуйте !
что означает в выпадающем меню метод IndexOf(…) у списков в питоне ?
например, создаю пустой список
list1 = []
далее пишу “list.” и выпадает меню с возможностью выбора (часто выбираю append, т.к. с ним научился работать и есть описание на питонворлд), а про IndexOf описания нет.
К тому же питон ругается, что такого метода нет (хотя в выпадающем списке он есть и где-то в чьем то коде я это встречал)
если возможно с примером.
заранее спасибо !
Задача: создать армирование по площади с вырезанным участком (два прямоугольника; один в другом)
Пытаюсь сделать с помощью метода AreaReinforcement Create Method (Document, Element, IList(Curve), XYZ, ElementId, ElementId, ElementId)
Получаю сообщение, что линии не смежны (По отдельности прямоугольники создаются).
Метода, чтобы добавить отверстия в имеющейся области не нашёл (NewOpening для армирования не работает).
Прошу помощи
Пару строк добавил, получилось один из параметров созданного экземпляра семейства изменить. Но почему-то оный параметр, который должен был задаваться входным параметром в строке p.Set(IN[2]), принимает какие-то непредсказуемые значения. Попробовал задавать значение числом (p.Set(400.0) ) , – почему-то в модели получаю значение параметра Диаметр сваи = 121920..
import clr
clr.AddReference(‘RevitAPI’)
from Autodesk.Revit.DB import *
clr.AddReference(“RevitNodes”)
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from Autodesk.Revit.DB.Structure import *
clr.AddReference(‘RevitAPIUI’)
from Autodesk.Revit.UI import *
clr.AddReference(‘RevitNodes’)
# импорт и работа с геометрией Dynamo
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
doc = DocumentManager.Instance.CurrentDBDocument
point = UnwrapElement(IN[0])
famtype = UnwrapElement(IN[1])
elementlist = list()
ST = StructuralType.NonStructural
TransactionManager.Instance.EnsureInTransaction(doc)
newobj = doc.Create.NewFamilyInstance(point.ToXyz(),famtype,ST)
p=newobj.LookupParameter(“Диаметр сваи”)
p.Set(IN[2])
newobj.ToDSType(True)
elementlist.append(newobj)
TransactionManager.Instance.TransactionTaskDone()
OUT = elementlist[0]
Здравствуйте! Пытаюсь сделать первые шаги (как в динамо, так и в пайтоне..). Методом тыка/копипаста создал код (вроде рабочий), получающий на входе Family Types, точку вставки и несколько числовых значений и создающий экземпляр семейства. Подскажите, пожалуйста, как для свежерожденного newobj получить/изменить свойства экземпляра? Ну то бишь, через пайтон сделать примерно то, что делает в динамо “Element.SetParameterByName”?
import clr
clr.AddReference(‘RevitAPI’)
from Autodesk.Revit.DB import *
clr.AddReference(“RevitNodes”)
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from Autodesk.Revit.DB.Structure import *
clr.AddReference(‘RevitAPIUI’)
from Autodesk.Revit.UI import *
clr.AddReference(‘RevitNodes’)
# импорт и работа с геометрией Dynamo
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
doc = DocumentManager.Instance.CurrentDBDocument
point = UnwrapElement(IN[0])
famtype = UnwrapElement(IN[1])
elementlist = list()
ST = StructuralType.NonStructural
TransactionManager.Instance.EnsureInTransaction(doc)
newobj = doc.Create.NewFamilyInstance(point.ToXyz(),famtype,ST)
newobj.ToDSType(True)
elementlist.append(newobj)
TransactionManager.Instance.TransactionTaskDone()
OUT = elementlist[0]

Вот что получилось у меня.

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('System.Core')
import System
clr.ImportExtensions(System.Linq)
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
kns = IN[0]
list,list1,list2 = [],[],[]
kns1=kns.Where(lambda x: UnwrapElement(x).LookupParameter("Марка").AsString()> 0)
kns2=kns.Where(lambda x: UnwrapElement(x).LookupParameter("Марка").AsString()< 0)
for k in kns1:
k1=UnwrapElement(k).LookupParameter("Марка").AsString()
list1.append(k1)
a = IN[1][0]
c = IN[1][2]
S,T = [],[]
for i in range(len(a)):
for j in range(len(list1)):
if a[i]==list1[j]:
S.append(c[i])
TransactionManager.Instance.EnsureInTransaction(doc)
for s,t in zip(S,kns1):
UnwrapElement(t).LookupParameter("Комментарии").Set(s)
s1=UnwrapElement(t).LookupParameter("Комментарии").AsString()
T.append(s1)
TransactionManager.Instance.TransactionTaskDone()
OUT = list1,kns2,T
Получилось через List.AllIndicesOf,но не могу отчисть от пустых списков,если надо сохранить структуру вложений первого списка.

Пытался
сделать используя нод List.AllIndicesOf, не получилось с уровнями разобраться.
А вот так получилось,проверяй.Не вижу кнопки загрузить файл.Поэтому скрин.

Здравствуйте.
В скрипте получены значения параметров в зависимости от имени типа.
Подскажите, пожалуйста, как просуммировать эти значения параметров, так что бы суммы были внутри соответствующих подсписков?
Возможно непонятно объяснил, потому прикладываю рисунок с желаемым результатом (выделено красным + показано стрелочками).
Спасибо.


Скрипт:
import clr
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
from Autodesk.DesignScript.Geometry import *
clr.AddReference(“RevitAPI”)
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
Elems = UnwrapElement(IN[0])
listElems = []
for i in Elems:
sublistElems = []
for k in i:
if “12 A500” in doc.GetElement((k).GetTypeId()).get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM).AsString():
sublistElems.append((k).LookupParameter(“Объем арматуры”).AsDouble())
if “8 A240” in doc.GetElement((k).GetTypeId()).get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM).AsString():
sublistElems.append((k).LookupParameter(“Объем арматуры”).AsDouble())
if “Подготовка” in doc.GetElement((k).GetTypeId()).get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM).AsString():
sublistElems.append((k).LookupParameter(“Объем”).AsDouble())
if “Монолитная” in doc.GetElement((k).GetTypeId()).get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM).AsString():
sublistElems.append((k).LookupParameter(“Объем”).AsDouble())
listElems.append(sublistElems)
OUT = listElems
Мда … я так и подозревал, что произвожу операции с цифрами, не имеющими связи с обьектами.
Пытаюсь получить в результате сгруппированные списки, в виде … 0 List (все перекрытия 0 этажа); 1 List (все перекрытия 1 этажа) … и.т.д.
На Питон пока нет времени, да и не очень он мне дается. Забил вручную, те кода на питоне, что вы ответили. Забил английские аналоги параметров (у меня английский Ревит). Выдает ошибку.
1.
2.`import clr
clr.AddReference(“RevitAPI”)
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference(“RevitServices”)
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
from operator import itemgetter
wall=FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements()
column=FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns).WhereElementIsNotElementType().ToElements()
floor=FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors).WhereElementIsNotElementType().ToElements()
lk,ll,lm = [],[],[]
for k in wall:
r = k.LookupParameter(“Базовая зависимость”).AsValueString()
lk.append(r)
for l in column:
s = l.LookupParameter(“Базовый уровень”).AsValueString()
ll.append(s)
for m in floor:
t = m.LookupParameter(“Уровень”).AsValueString()
lm.append(t)
OUT = lk,wall,ll,column,lm,floor`
3. `import clr
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
a = IN[0]
list1,list2 = [],[]
for k,l in zip(range(len(a)),a):
ul = UnwrapElement(l)
if k%2:
list1.append(l)
else:
list2.append(l)
OUT = dir(ul)
OUT = list1,list2`
попробовал вставить код, получаю ошибку NameError: name ‘LegendComponent’ is not defined. если написать LegendComponentS , то выдает: AttributeError: ‘List[Element]’ object has no attribute ‘get_Parameter’.
есть подозрения по поводу 4 пункта, скорее всего type Id у типа семейства и компонента легенды разные
Как я себе вижу
1) Собираешь список всех окон в проекте (через Filtered .. .WhereElementIsNotElementType().ToElements())
2) Определяешь ID семейств типов этих окон (через doc.GetElement(window.GetTypeId()).Id (через Set(list) оставляешь уникальные)
3) Собираешь список всех компонентов легенды с одновременным определением ID типа элемента внутри (см.8392 и (2)) – соединяешь 2 списка через zip
4) в циклах проходишь по списку из (2) и из (3) при совпадении их Id типов, получаешь компонент легенды (или его Id)
Приношу извинения, с файлом проекта все в порядке, это я без опыта не нашел в 3Д электрических цепей, но потом таки нашел на плане.

tip = IN[0]
polus = IN[1]
sechen = IN[2]
elem = IN[3]
d, list = [],[]
for t,p,s,el in zip(tip,polus,sechen,elem):
e = round(s,1)
ke = t.Name
c = ke+" "+str(p)+"х"+str(e)
d.append(c)
uel=UnwrapElement(el)
uel.LookupParameter("MS_марка провода").Set(c)
mark1=uel.LookupParameter("MS_марка провода").AsString()
list.append(mark1)
OUT = list
Немного изменил.
Будто-бы получилось все сделать. Единственное, нужно добавить фильтр по стадиям помещений, если они у вас различаются.
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
W = IN[0]
L = IN[1]
a = IN[2]
b = IN[3]
c = IN[4]
d = IN[5]
pointX = IN[6]
pointY = IN[7]
pointZ = IN[8]
l1,i1 = [],[]
k = []
n = []
xlev = []
kkk = []
for l,w,pX in zip(L,W,pointX):
k1 = (l-c*2)//a #узнаём количество вставляемых семейств по х
if k1>0:
k2 = k1
n1 = (l-k2*a)/2 #новый отступ от стен
xlev1 = pX - l/2 + n1 #координата по Х первого вставляемого семейства
k.append(k2)
n.append(n1)
xlev.append(xlev1)
kn = range(1,int(k2)+1)
kkk.append(kn)
else:
k2 = 0
k.append(k2)
kn = range(1,int(k2)+1)
#kkk.append(kn)
listX,listY,listZ = [],[],[]
for kk,xl,y,z in zip(kkk,xlev,pointY,pointZ):
listX1,listY1,listZ1 = [],[],[]
for ks in kk:
xx = ks*a+xl
yy = y
zz = z
listX1.append(xx)
listY1.append(yy)
listZ1.append(zz)
listX.append(listX1)
listY.append(listY1)
listZ.append(listZ1)
OUT = listX,listY,listZ