【问题标题】:Revit Dynamo gives error Data Interpolate python scriptRevit Dynamo 给出错误数据插值 python 脚本
【发布时间】:2018-09-12 20:40:28
【问题描述】:

Interpolate Date- Catmull 我收到以下错误:TypeError: can't multiply sequence by non-int of type 'float'

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

【问题讨论】:

  • IN 中有什么内容?请发布代码而不是图片。
  • IN[0]= 要插入的值; IN[1]= 参数
  • 好的,但请显示您的变量IN
  • 0 0.055556 0.111111 0.166667 0.222222 0.277778 0.333333 0.388889 0.444444 0.5 0.555556 0.611111 0.666667 0.722222 0.777778 0.833333 0.888889 0.944444 1 0 0.027778 0.055556 0.083333 0.111111 0.138889 0.166667 0.194444 0.222222 0.25 0.277778 0.305556 0.333333 0.361111 0.388889 0.416667 0.444444 0.472222 0.5 0.527778 0.555556 0.583333 0.611111 0.638889 0.666667 0.694444 0.722222 0.75 0.777778 0.805556 0.833333 0.861111 0.888889 0.916667 0.944444 0.972222 1
  • - 1.075 -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.553555 4.807834 5.069212 5.349055 5.64976 5.971703 跨度>

标签: python interpolation revit-api


【解决方案1】:
  • 在您的 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]

您正在尝试按索引 (num3) 访问 values 列表中的一个元素,因此您的索引必须是一个整数,在您的情况下,它是一个将其更改为:num3 = int(floor(num2))

【讨论】:

  • 谢谢。我改变了这两行,但我仍然遇到错误。在“线性插值”中,缩进似乎不正确。在“catmull 插值”中,定义需要一个数字,但会得到一个列表(即使我正在循环遍历来自 IN[1] 的所有输入)
  • 经过我告诉你的 2 处修改,你的代码运行良好。
【解决方案2】:

所以@arthur 的上述回答是正确的,您正试图将float 传递到需要整数的列表索引查询中。改变那条线为我解决了这个问题。这是来自 Dynamo 的实际图像/代码 sn-p。

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

附言。关于缩进,我想说 Dynamo 的设置方式要求您选择一种样式。要么是空格,要么是制表符,最好保持一致。我之前混合它们时遇到了一些麻烦(偶然)。我重新格式化了您的代码,它适用于所有选项卡。

代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2013-04-19
    • 2011-01-30
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多