для chop в pyhon используйте это (работает с текстом, поэтому вначале нужен str(inn)):
inn = str(11223234)
chop = 2
listChop = [int(inn[i*chop:i*chop+chop]) for i in range(len(inn)/chop)]
Вывод будет таким: [11, 22, 32, 34]
сделать вначале сплошной список, затем разделить на равные отрезки, как метод chop в ноде – однако у меня его не получилось запустить (т.е. в питоне использовать DS.Core.List.Chop(t1,t2) – библиотеки RevitNodes, DS Core подключал -чет пишет ошибку)
но ,несомненно, есть способ проще, как сделать циклами и append или чего то в этом духе… буду искать способы…
Товарищи помогите разобраться почему Dynamo пишет это?:
Предупреждение:IronPythonEvaluator.EvaluateIronPythonScript операция не выполнена.
Traceback (most recent call last):
File “<string>”, line 32, in <module>
Exception: One or more element ids was not suitable for merging with the others. Specified elements should all be Parts, report the same material, creation and demolition phases, and have contiguous geometry.
Parameter name: partIds
вот скрипт:
import clr
clr.AddReference(‘RevitAPI’)
from Autodesk.Revit.DB import *
clr.AddReference(‘ProtoGeometry’)
from Autodesk.DesignScript.Geometry import *
как видим у Parts – параметры одинаковы. По условиям всё соблюдено (Specified elements should all be Parts, report the same material, creation and demolition phases, and have contiguous geometry).
Друзья,
может кто нибудь подсказать как сделать в нашем динамовском питоне интерполяцию (т.е. может есть специальная встроенная библиотека):
Конкретно нужна линейная интерполяция :
допустим есть списки ,самый простой случай:
List_x=[1,2,3,4]
List_y=[1,2,3,4]
то есть если вводим x=1,5 , то скриптом находятся ближайшие значения из обоих списков – в нашем случае – это [1, 2] потом по формуле интерполяции выдается значение y=1,5
“Что такое parts на стенах ?” имеется ввиду вот что: “Parts can be generated from elements with layered structures, such as: Walls (excluding stacked walls and curtain walls)”.
Не работает((( вот что пишет нод: “Предупреждение:IronPythonEvaluator.EvaluateIronPythonScript операция не выполнена.
Traceback (most recent call last):
File “<string>”, line 25, in <module>
AttributeError: ‘list’ object has no attribute ‘Id'”
если нижнюю чать (после doc =.. ) заменить вот на это:
import System
from System import Array
from System.Collections.Generic import *
Ids=List[ElementId]()
Ids.Add(ElementId(IN[0].Id))
TransactionManager.Instance.EnsureInTransaction(doc)
elemPatr = PartUtils.CreateParts(doc, Ids)
TransactionManager.Instance.TransactionTaskDone()
то ошибок не выдает.
Кстати метод PartUtils.CreateParts(doc, Ids) ничего не возвращает, так что elemPatr от этой команды можно и не ждать
Добрый день, помогите пожалуйста с кодом. По задумке должно выполнятся взаимодействие 1 элем в списке 1 с 1м элем в списке 2, 2й элем в списке 1 со 2м элем в списке 2 и тд
Но у меня выходит что у меня просто все элементы взаимодействуют со всеми.
for elementA in elementlistA:
for elementB in elementlistB:
try:
result = Autodesk.Revit.DB.JoinGeometryUtils.SwitchJoinOrder(doc,elementA,elementB)
results.append(result)
except:
pass
TransactionManager.Instance.TransactionTaskDone()
И друзья, обратите внимание на эту конструкцию list(iter(digs(i))) это получение удобоваримого списка из любого итерируемого объекта. Зачастую при работе с объектами Ревит(импорт геометрии, импорт параметров) приходят интересные объекты, которые вроде являются списками, но не всегда обрабатываются обычными методами списков, бывает что обрабатываются нестабильно – вчера скрипт работал, а с утра перестал. Возможно вы уже сталкивались с такой проблемой. В данном случае я с помощью этого приема преобразовал (a,b) – tuple в [a,b] – list
не знал, что sorted может сразу по 2 параметрам сортировать..
тогда поправил свой код (уложился в 1 строку, не считая import):
from operator import itemgetter
OUT = zip(*sorted(zip([int(i.split(".")[0][1:]) for i in list1], [int(i.split(".")[1]) for i in list1], list1), key=itemgetter(0,1)))[2]
p.s. Если префикс (в данном примере буква “В”) будет состоять из нескольких букв, то нужно заменить [1:] на нужное количество букв
в Python в 1 строчку и без регулярных выражений )) (но для читаемости лучше этот код записывать в несколько строк)
OUT = zip(*sorted(zip([int(i.split(".")[1]) for i in IN[0]], IN[0]), key = lambda lists: lists[0]))[1]
для тех, кто изучает python несколько слов про код:
– split разделяю по точке “.” и создаю новый список цифр (int переводит текст в цифры) (в нашем примере 10, 3, 2, 1, 11)
– zip соединяю 2 списка – наши цифры и исходный
– sorted key lambda – сортирую наш объединенный список, но по цифрам (lists[0])
– zip(*list)[1] – разъединяю объединенный список и получаю исходный отсортированный по цифрам
еще пример здесь p.s. код не сортирует по цифрам до точки, т.е. не работает с В1.1, В2.1 ..