Failure to scale in pyclipper - TypeError: 'Zero' object is not iterable

Failure to scale in pyclipper - TypeError: 'Zero' object is not iterable

我刚刚遇到一个 TypeError 我以前从未见过并且无法弄清楚为什么会发生。谷歌搜索错误 TypeError: 'Zero' object is not iterable returns 没有结果。我在 python 2.7 和 3.5 中测试过,两种情况下的错误都是一样的。

这是 MCVE:

from sympy.geometry.polygon import Polygon
import pyclipper as pc

start_list = [(0, 2), (2, 2), (2, 0), (0, 0)]
scaled = pc.scale_to_clipper(start_list)  # this works fine

as_poly = Polygon(*start_list)
new_list = [(pt.x, pt.y) for pt in as_poly.vertices]
assert new_list == start_list  # check that the lists are the same (this passes)

fail_to_scale = pc.scale_to_clipper(new_list)  # this fails

以及回溯:

Traceback (most recent call last):
  File "C:\Users\Jamie\<blah>\mcve.py", line 10, in <module>
    fails = pc.scale_to_clipper(new_list)
  File "pyclipper/pyclipper.pyx", line 544, in pyclipper.scale_to_clipper (pyclipper/pyclipper.cpp:3535)
  File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3454)
  File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3454)
  File "pyclipper/pyclipper.pyx", line 542, in pyclipper.scale_to_clipper.scale_value (pyclipper/pyclipper.cpp:3416)
TypeError: 'Zero' object is not iterable

有人知道这个错误的来源和解决方法吗?

这已在 PyClipper 版本 1.0.2 中修复,这比使用下面描述的解决方法更可取

好的,我已经将问题追溯到 Polygon 中存储的值。问题是值 0 被 SymPy 存储为 sympy.Zero.

这些 sympy.Zero 值不被 polyclipper.scale_to_clipper() 接受,因此在检查时提高 TypeError

为了避免这个问题,我可以生成 new_listpt.xpt.y 转换为 float:

new_list = [(float(pt.x), float(pt.y)) for pt in as_poly.vertices]