Revit Dynamo提供错误Data Interpolate python脚本

时间:2018-04-03 13:32:45

标签: python interpolation revit-api

Interpolate Date- Catmull 我得到以下错误:TypeError:不能将序列乘以'float'类型的非int

Interpolate Date-Linear 我收到以下错误:Unexpexted Token“v3”

我是Python的新手,并想知道我在使用这段代码时遇到了什么问题。 谢谢 下面是D和t的输入。

IN[0]
-1.075000
-0.885818
-0.688475
-0.483791
-0.301645
-0.114591
0.077063
0.273042
0.473106
0.677038
1.025973
1.306626
1.592869
1.884406
2.363634
2.597338
2.833636
3.072438
3.313663
3.557232
3.803073
4.051116
4.301297
4.807834
5.069212
5.349055
5.649760
5.971703

IN[1]
0.000000
0.055556
0.111111
0.166667
0.222222
0.277778
0.333333
0.388889
0.444444
0.500000
0.555556
0.611111
0.666667
0.722222
0.777778
0.833333
0.888889
0.944444
1
0.000000
0.027778
0.055556
0.083333
0.111111
0.138889
0.166667
0.194444
0.222222
0.250000
0.277778
0.305556
0.333333
0.361111
0.388889
0.416667
0.444444
0.472222
0.500000
0.527778
0.555556
0.583333
0.611111
0.638889
0.666667
0.694444
0.722222
0.750000
0.777778
0.805556
0.833333
0.861111
0.888889
0.916667
0.944444
0.972222
1

D=IN[0]  
t=IN[1]  
a=[]

def SampleLinear(v0, v1, t):  
    value = v0 * (1.0 - t) + v1 * t  
    return value

def Interpolate (values, parameter):  
    num = len(values) - 1  
    num2 = parameter * float(num)  
    num3 = int((float(floor(num2)))  
    v3 = values[num3]  
    v4 = values[num3]  
    value = SampleLinear(v3, v4, num2 - float(num3))  
    return value  

for i in t:  
    a.append(Interpolate(D,i))

OUT = a
D=IN[0]  
t=IN[1]  
a=[]  



        def SampleCatmull(v00,v0,v1,v11,t):  
           num = -0.5 * v00 + 1.5 * v0 - 1.5 * v1 + 0.5 * v11 
            num2 = v00 - 2.5 * v0 + 2.0 * v1 - 0.5 * v11  
            num3 = -0.5 * v00 + 0.5 * v1  
            value = num * (t * t * t) + num2 * (t * t) + num3 * t + v0  
            return value  



    def Interpolate(values, parameter):  
        num = len(values) - 1  
        num2 = parameter * float(num)  
        num3 = float(floor(num2))  
        num6 = values[num3]  
        v7 = 0  
        v8 = 0  
        num7 = values[num3]  
        if num3 <= 0:  
            v7 = num6 - (num7 - num6)  
        else:  

            v7 = values[num3 - 1]  

        if num3 >= num - 1:  
            v8 = num7 - (num6 - num7)  
        else:  

            v8 = values[num3 + 2]  

        value = SampleCatmull(v7, num6, num7, v8, num2 - float(num3))  

        return value  


    for i in t:  
        a.append(Interpolate(D, i))  

    OUT = a

2 个答案:

答案 0 :(得分:0)

  • 在您的Interpolate Date-Linear:

你忘记了num3 = int((float(floor(num2)))行的括号 应该是:num3 = int((float(floor(num2))))

  • 在您的插值日期 - Catmull:

当你这样做时:

num3 = float(floor(num2)) # num3 is of type float, should be int 
num6 = values[num3]

您正试图通过索引(values)访问num3列表的元素,因此您的索引必须是整数,在您的情况下,它是&#39; sa将其更改为:{{ 1}}

答案 1 :(得分:0)

所以@arthur的上述答案是正确的,你试图将float传递给需要整数的列表索引查询。改变那条线为我解决了问题。这是Dynamo的实际图片/代码片段。

您遇到的另一个问题是将浮点数0.00001与列表1中的整数混合在一起。始终如一。

聚苯乙烯。关于缩进的主题,我会说Dynamo,它的设置方式,要求你选择一种风格。它既可以是空格,也可以是标签,最好保持一致。我之前(偶然)混合它时遇到了一些麻烦。我重新格式化了你的代码,它适用于所有标签。

enter image description here

代码:

import clr
import sys
pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib'
sys.path.append(pyt_path)
from math import floor

def SampleCatmull(v00,v0,v1,v11,t):
    num = -0.5 * v00 + 1.5 * v0 - 1.5 * v1 + 0.5 * v11
    num2 = v00 - 2.5 * v0 + 2.0 * v1 - 0.5 * v11
    num3 = -0.5 * v00 + 0.5 * v1
    value = num * (t * t * t) + num2 * (t * t) + num3 * t + v0
    return value

def Interpolate(values, parameter):
    num = len(values) - 1
    num2 = parameter * float(num)
    num3 = (int)(floor(num2))
    num6 = values[num3] #num3 has to be an index (int)
    v7 = 0
    v8 = 0
    num7 = values[num3]
    if num3 <= 0:
        v7 = num6 - (num7 - num6)
    else:
        v7 = values[num3 - 1]
    if num3 >= num - 1:
        v8 = num7 - (num6 - num7)
    else:
        v8 = values[num3 + 2]
    value = SampleCatmull(v7, num6, num7, v8, num2 - float(num3))
    return value

D=IN[0]
t=IN[1]
a=[]

for i in t:
    a.append(Interpolate(D, i))  
#Assign your output to the OUT variable.
OUT = a

这是另一个:

import clr
import sys
pyt_path = r'C:\Program Files (x86)\IronPython 2.7\Lib'
sys.path.append(pyt_path)
from math import floor

def SampleLinear(v0, v1, t):
    value = v0 * (1.0 - t) + v1 * t
    return value

def Interpolate (values, parameter):
    num = len(values) - 1
    num2 = parameter * float(num)
    num3 = (int)(floor(num2))
    v3 = values[num3]
    v4 = values[num3]
    value = SampleLinear(v3, v4, num2 - float(num3))
    return value  

D=IN[0]
t=IN[1]
a=[]

for i in t:
    a.append(Interpolate(D,i))
#Assign your output to the OUT variable.
OUT = a