2

提前感谢您的意见。

我今天开始学习 Python,因为我想在 DynamoBIM (Revit) 中定义自定义 Python 节点,以便在 BIM 中没有预定义/适合我的任务的节点时更加灵活。

PythonScript 从输入节点获取输入,这些节点是IN[i].
在我的例子中,我使用 2 个bool值 ( IN[0], IN[3])、 1x str IN[1]、 1xfloat IN[2]和 1x list IN[4]

通过 PythonScript 处理输入后,它会返回一个结果 ( OUT),该结果可用于进一步的任务。

我试图在每个列表项之前附加一个前缀,如果并在每个列表项更改之前IN[0] = True添加一个值。IN[2]结果显示在观察节点中。


如果IN[3] = False(列表未被替换)我得到了想要的结果:

在此处输入图像描述

在 的情况下IN[3] = True,自定义列表不会得到调整(不添加前缀,不添加值):

在此处输入图像描述


(集成)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 代码(可在在线编译器中编译)

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)

我尝试使用 python 代码从在线编译器中的集成脚本重现该问题,但在这种情况下,计算出预期的结果:

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

使用https://www.programiz.com/python-programming/online-compiler/编译


预期结果应该是:

在此处输入图像描述

我目前完全不知道为什么在线编译器代码和集成的 PythonScript 之间会有不同的结果。

4

2 回答 2

1

我以前在使用 dynamo 和 python 时遇到了一些问题,大多数时候我发现最好的做法是OUT在代码末尾只使用一次。我拿了你的样品并修改了它,试试看。我添加了一个空列表,它将用作已处理列表的容器,并将其分配给输出

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

并且不要忘记在 Dynamo 内的 Python 节点中查看您的缩进。

于 2021-07-08T23:58:05.390 回答
1

进行了一些额外的编辑,解决方案现在正在工作:

当在 Dynamo 中用作节点时,以下(集成的)PythonScript 会产生预期的结果:

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

praefix = IN[1]
add = IN[2]
custom = IN[4]

newListing = []

if IN[3]:
    listing = custom
    
if IN[3]:
    for x in range(len(custom)):
            try:
                listing[x] = int(custom[x])
            except:
                pass

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

现在也可以为自定义列表实现结果:

在此处输入图像描述

于 2021-07-09T09:02:38.940 回答