【问题标题】:TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType类型错误:+= 不支持的操作数类型:'int' 和 'NoneType
【发布时间】:2021-03-29 02:09:25
【问题描述】:

我需要将对象的边缘涂上颜色。我对python的了解很差,但是我的老师给出了这段代码,这就是它发生的事情。

def triangleArea(half_edge):

    a = len (half_edge)
    b = len (half_edge.edge_next)
    c = len (half_edge.edge_next.edge_next)
    
    s = (a + b + c) / 2
    area = math.sqrt(s * (s - a)*(s - b)*(s - c))
    return area

def angle(half_edge):
    
   v1 = half_edge.vertex
   v2 = prev(half_edge).vertex
   v3 = half_edge.edge_next.vertex
   
   angle = math.acos(((v2.co.x - v1.co.x)*(v3.co.x - v1.co.x)+(v2.co.y - v1.co.y)*(v3.co.y - v1.co.y)+(v2.co.z - v1.co.z)*(v3.co.z -v1.co.z))/(len(prev(half_edge))*len(half_edge)))
   
   if (angle > math.pi / 2):
       print (">90")
       return angle
   
def curvature(v):
    anglesSum = 0  
    completeArea = 0
    for e in h_edge_list:
        if (v == e.vertex):
            start_edge = e
            anglesSum += angle(start_edge)
            completeArea += triangleArea(start_edge)
            
    half_edge = start_edge.edge_next
    cur = (2*math.pi - anglesSum)/completeArea
    color (half_edge, cur, 0.13, 0.29)#farbime z intervalu 0 az 2/3
    return cur

for e in h_edge_list:
    print (curvature(e.vertex))
      
bmesh.free()  # free and prevent further access

使用 S 运算符的最后几行代码出错 enter image description here

【问题讨论】:

  • 您的angle 函数有时会返回None。也许这就是错误的根源?

标签: python


【解决方案1】:

当此条件为 False 时,您的 angle 函数会返回 None

if (angle > math.pi / 2):
   print (">90")
   return angle

这就是当前angle 函数中return 的样子

def angle(half_edge):
    
   v1 = half_edge.vertex
   v2 = prev(half_edge).vertex
   v3 = half_edge.edge_next.vertex
   
   angle = math.acos(((v2.co.x - v1.co.x)*(v3.co.x - v1.co.x)+(v2.co.y - v1.co.y)*(v3.co.y - v1.co.y)+(v2.co.z - v1.co.z)*(v3.co.z -v1.co.z))/(len(prev(half_edge))*len(half_edge)))
   
   if (angle > math.pi / 2):
       print (">90")
       return angle
   return None

如果(angle > math.pi / 2) 条件为False,则返回 None

也许您想返回 angle 值,无论条件是什么(这使得 if 语句变得不必要), 通过减少缩进标签

def angle(half_edge):
    
   v1 = half_edge.vertex
   v2 = prev(half_edge).vertex
   v3 = half_edge.edge_next.vertex
   
   angle = math.acos(((v2.co.x - v1.co.x)*(v3.co.x - v1.co.x)+(v2.co.y - v1.co.y)*(v3.co.y - v1.co.y)+(v2.co.z - v1.co.z)*(v3.co.z -v1.co.z))/(len(prev(half_edge))*len(half_edge)))
   
   if (angle > math.pi / 2):
       print (">90")
   return angle

【讨论】:

    【解决方案2】:

    如果此条件为False,则此if 语句将返回None

    if (angle > math.pi / 2):
       print (">90")
       return angle
    

    您需要在角度函数中至少添加一个else 语句。

    【讨论】:

      【解决方案3】:

      如果不满足内部条件,则角度函数将返回 NoneType,并且 += 运算符不能与 NoneType 值一起使用。尝试返回 0。

      if (angle > math.pi / 2):
          print (">90")
          return angle
      else:
          return 0
      

      【讨论】:

        猜你喜欢
        • 2014-03-16
        • 2020-08-26
        • 1970-01-01
        • 2023-02-12
        • 1970-01-01
        • 2019-08-22
        • 2014-04-20
        相关资源
        最近更新 更多