Python sublists

Hi All ,

Can any one help me to sort this lambda issue.

All im trying to-do is create schedule sorting filed within one function.

Thanks in advance

Regards

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)

#Function to handle any list structure
ProcessLists = lambda function, lists: [ProcessLists(function, item) if isinstance(item, list) else function(item) for item in lists]
ApplyFunction = lambda func, objs: ProcessLists(func, objs) if isinstance(objs, list) else [func(objs)]

#Funtion to unwrap
def Unwrap(item):
    return UnwrapElement(item)
    
#Preparing input from dynamo to revit 
if isinstance(IN[0], list):
	refschedule = ProcessLists(Unwrap, IN[0])
else:
	refschedule = Unwrap(IN[0])

#Preparing input from dynamo to revit 
if isinstance(IN[1], list):
	id = ProcessLists(Unwrap, IN[1])
else:
	id = Unwrap(IN[1])





TransactionManager.Instance.EnsureInTransaction(doc)

#Define function to get view type
def getViewType(refschedule, id):
    sheduledef = refschedule.Definition
    shedule = sheduledef.AddSortGroupField(id)
    return shedule


TransactionManager.Instance.TransactionTaskDone()


OUT = ApplyFunction(getViewType,refschedule,id)

Hi,
can you share a screenshot from your dyn with showing the input elements of the python node (list structure)

1 Like

Thanks for your time.

List structure as below.

Problem i have getting to use 2 variables in function not quiet get this lambda thing.

As AddSortingfiled requires 2 inputs & list varies in length so as they come in is perfect to manage all parameters for schedule. But stuck on last bit. Can get it to work with single schedule but with multiple schedules is difficult to get working

Regards

try:

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)


#Funtion to unwrap
def Unwrap(item):
    return UnwrapElement(item)
    
refschedule = Unwrap(IN[0])

id = Unwrap(IN[1])





TransactionManager.Instance.EnsureInTransaction(doc)

#Define function to get view type
def getViewType(refschedule, id):
    sheduledef = refschedule.Definition
    shedule = sheduledef.AddSortGroupField(id)
    return shedule


TransactionManager.Instance.TransactionTaskDone()

OUT = [map(getViewType, i, j) for i, j in zip(refschedule, id)]
2 Likes

Thanks For your time. I’m really appreciate it.

Im getting error “List Has no attribute .Definition”

Its looks like it still don’t like sub lists
Regards

oops, was trying to simplify code, ok now rewrite in long code:
try this:

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)


#Funtion to unwrap
def Unwrap(item):
    return UnwrapElement(item)
    
refschedules = Unwrap(IN[0])

ids = Unwrap(IN[1])





TransactionManager.Instance.EnsureInTransaction(doc)

#Define function to get view type
def getViewType(refschedule, id):
    sheduledef = refschedule.Definition
    shedule = sheduledef.AddSortGroupField(id)
    return shedule


TransactionManager.Instance.TransactionTaskDone()

output = []
for refschedule, id in zip(refschedules, ids):
	for r, i in zip(refschedule, id):
		output.append(getViewType(r, i))

OUT = output
1 Like

Thanks Again.

Still got an error

Regards

@dkeinys,

Hi,

Those functions don’t work with parallel lists, but try these:

elemsA = IN[0]
elemsB = IN[1]

ProcessParallelLists = lambda function, *lists: [ProcessParallelLists(function, *lst) if all(isinstance(l, list) for l in lst) else function(*lst) for lst in zip(*lists)]
ApplyFunction = lambda func, *args: ProcessParallelLists(func, *args) if all(isinstance(arg, list) for arg in args) else [func(*args)]

sum = lambda x,y: x + y
OUT = ApplyFunction(sum, elemsA, elemsB)

If you don’t want to use those functions and do it as @newshunhk told you, you have to iterate over the schedules first and then the other iterations.

Regards,

1 Like

hope this one works, coz I cannot test without your data

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)


#Funtion to unwrap
def Unwrap(item):
    return UnwrapElement(item)
    
refschedules = Unwrap(IN[0])

ids = Unwrap(IN[1])





TransactionManager.Instance.EnsureInTransaction(doc)

#Define function to get view type
def getViewType(refschedule, id):
    sheduledef = refschedule.Definition
    shedule = sheduledef.AddSortGroupField(id)
    return shedule


TransactionManager.Instance.TransactionTaskDone()

output = []
for refschedule, id in zip(refschedules, ids):
	for r, i in zip(refschedule, id):
		output.append([map(getViewType, a, b) for a, b in zip(r, i)])

OUT = output
1 Like

Thanks

I Have combined yours with original code & have to re do levels to get it to work properly.
It return NULL on output but do work.

Thanks

1 Like

@newshunhk thanks again.

Im Still get error on line 56.

But i can get to work with level restructure with @Organon code above

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)

#Function to handle any list structure
ProcessParallelLists = lambda function, *lists: [ProcessParallelLists(function, *lst) if all(isinstance(l, list) for l in lst) else function(*lst) for lst in zip(*lists)]
ApplyFunction = lambda func, *args: ProcessParallelLists(func, *args) if all(isinstance(arg, list) for arg in args) else [func(*args)]

#Funtion to unwrap
def Unwrap(item):
    return UnwrapElement(item)
    
#Preparing input from dynamo to revit 
if isinstance(IN[0], list):
	refschedule = ProcessParallelLists(Unwrap, IN[0])
else:
	refschedule = Unwrap(IN[0])

#Preparing input from dynamo to revit 
if isinstance(IN[1], list):
	id = ProcessParallelLists(Unwrap, IN[1])
else:
	id = Unwrap(IN[1])





TransactionManager.Instance.EnsureInTransaction(doc)

#Define function to get view type
def getViewType(refschedule, id):
    sheduledef = refschedule.Definition
    shedule = sheduledef.AddSortGroupField(id)
    return shedule


TransactionManager.Instance.TransactionTaskDone()


OUT = ApplyFunction(getViewType,refschedule,id)

And list structure been changed to [0,1,2] (No sub lists).

Thanks you both for your time

Regards

1 Like