Skip to content
Advertisement

Result of function is returned without changing list items in if-statement

Thanks in advance for your input.

I started learning Python today, because I want to define custom Python nodes in DynamoBIM (Revit) to be more flexible if there aren´t predefined / suitable nodes for my tasks in BIM.

The PythonScript gets input from input nodes, which are IN[i].
In my case I use 2 bool values (IN[0], IN[3]), 1x str IN[1], 1x float IN[2] and 1x list IN[4].

After processing the input via PythonScript it returns a result (OUT), which can be used for further tasks.

I tried to attach a prefix in front of every list item, if IN[0] = True and add a value IN[2] to each list item, before it´s changed. The result is displayed in the watch-node.


In case of IN[3] = False (list isn´t replaced) I get the desired result:

enter image description here

In case of IN[3] = True, the custom list, doesn´t get adapted (no prefix added, no adding of values):

enter image description here


Code of the (integrated) PythonScript:

listing = [0,1,2,3,4,5,None,"null", "", "Text"]
praefix = IN[1]
add = IN[2]

if IN[3]:
    listing = IN[4]

if IN[0]:
    for x in range(len(listing)):
        if isinstance(listing[x], int):
            listing[x] = praefix + str(listing[x] + add)
        
    OUT = listing
    
else:
    
    for x in range(len(listing)):
        listing[x] = listing[x] + add

    OUT = listing

Python-code (compilable in online compiler)

listing = [0,1,2,3,4,5,None,"null", "", "Text"]
replacingList = [2,2,3,"Test",4] #IN[4]

boolPraefix = True #IN[0]
praefix = "Indexwert: " #IN[1]
add = 7 #IN[2]
customList = True #IN[3]
replacingList = [2,2,3,"Test",4] #IN[4]

if customList:
    listing = replacingList
    
if boolPraefix:
    for x in range(len(listing)):
        if isinstance(listing[x], int):
            listing[x] = praefix + str(listing[x] + add)

    print(listing)

else:
    
    for x in range(len(listing)):
            listing[x] = listing[x] + add

    print(listing)

I tried to reproduce the problem from the integrated script in a online compiler with python code, but in this case the expected result got calculated:

['Indexwert: 9', 'Indexwert: 9', 'Indexwert: 10', 'Test', 'Indexwert: 11']

Compiled with https://www.programiz.com/python-programming/online-compiler/


Expected result should be:

enter image description here

I don’t currently have the slightest idea why there are different results between the online compiler code and the integrated PythonScript.

Advertisement

Answer

I Previously had some issues with dynamo and python, in most times I found that the best practice is to use OUT only once at the end of the code. I took your sample and modified it, Try it. I added an empty list that will be used as a container for the processed list, and assigned it to the output

listing = [0,1,2,3,4,5,None,"null", "", "Text"]
#Empty List to use as Output
NewListing =[]
praefix = IN[1]
add = IN[2]

if IN[3]:
    listing = IN[4]

if IN[0]:
    for x in range(len(listing)):
        if isinstance(listing[x], int):
            listing[x] = praefix + str(listing[x] + add)
        
    NewListing = listing
    
else:
    
    for x in range(len(listing)):
        listing[x] = listing[x] + add

    NewListing = listing

OUT NewListing

And don’t forget to review your indentations within the Python node inside Dynamo.

Advertisement