API говорит, что напрямую изменять поля спецификации нельзя. Т.е., как я понимаю, нужно вытащить параметры сортировки спецификации, реализовать их в Dynamo к выделенным элементам и замаркировать. Путь не самый простой, может кто-то видит его проще? К тому же не могу понять, как вытащить параметр сортировки.
Clear List удаляет null значения (этот нод входит в пакет Archi-Lab Grimshaw)
Стандартный нод UniqItems – удаляет дублирующие значения (аналог set(list) в python), но они оба не работают с геометрией (точки, линии и пр.), тут нужны другие подходы.
zip и unzip списков (листов) (не путать с zip файлами )))
# объединение элементов из каждого списка
a = [1,2]
b= [3,4]
c= [5,6]
L= zip(a, b, c)
OUT = L # результат [(1, 3, 5), (2, 4, 6)]
# разъединение zip листа (например, после сортировки sorted(L, key = lambda lists: lists[0]))
a = zip(*L)[0] # [1,2]
b = zip(*L)[1] # [3,4]
c = zip(*L)[2] # [5,6]
Решение: создавать элементы не средствами Динамо, с через питон.
Я использовал команду doc.Create.NewFamilyinstance. Тогда семейства создаются без привязки к Динамо. Если нужно, могу подсказать как работать с NewFamilyinstance.
p.s.
import Revit
clr.ImportExtensions(Revit.Elements)
Element.ToDSType(False) – если мы создали элемент в Dynamo (и его не было в Revit) – Dynamo будет отслеживать. Т.е. при очередном запуске старый элемент будет удаляться и создаваться новый!
Element.ToDSType(True) – Dynamo не будет отслеживать и при каждом запуске будут создаваться новые элементы, старые удаляться не будут.
Хасан уже выше написал, но все же повторюсь для закрепления
Вот эту конструкцию кода
Можно записать короче и несколькими способами:
sposob1 = [i for i in numbers if i<4]
sposob2 = list(i for i in numbers if i<4) # или (i for i in numbers if i<4)
sposob3 = filter(lambda x: x<4, numbers)
В общем если кому то интересно, то такая возможность имеется, и размерный текст можно двигать програмно. Если кому интересно то вот код макроса… Он на C# но думаю все всем понятно, и при желании его можно к питону в легкую запилить, и наверное в динамо)
public void DimText()
{
Document doc = this.ActiveUIDocument.Document;
//Application app = this.Application;
UIDocument uidoc = new UIDocument(doc);
//Выбираес размеры
IList elementList = uidoc.Selection.PickElementsByRectangle();
using (Transaction t = new Transaction(doc,"Move dim text"))
{
t.Start();
//проходимся по каждому размеру
foreach (Dimension element in elementList)
{
//если количество сегментов больше 1 то работаем с каждым сегментом по отдельности
if (element.NumberOfSegments>1)
{
foreach (DimensionSegment S in element.Segments)
{
data+=S.ValueString+Environment.NewLine;
S.TextPosition=new XYZ(S.TextPosition.X+1,S.TextPosition.Y + 1, 0);
}
}
//Если 1 то с самим размером
else
element.TextPosition=new XYZ(element.TextPosition.X+1,element.TextPosition.Y + 1, 0);
}
t.Commit();
}
}
Надо бы еще допилить фильтры, чтоб он не редактировал размеры больше определенного значения, и настроить правила разноса и можно сделать не хуже чем в в Allplan )