python-2.7python-3.xsympypyclipper

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


I've just come up against a TypeError I've not seen before and can't figure out why it's occurring. Googling for the error TypeError: 'Zero' object is not iterable returns no results. I've tested in python 2.7 and 3.5 and the error is the same in both cases.

Here's the 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

And the traceback:

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

Does anyone know what the source of and solution to this error could be?


Solution

  • This has been fixed in PyClipper version 1.0.2, which is preferable to using the workaround described below

    Ok, I've tracked the problem back to the values stored in Polygon. The issue is that the value 0 is stored by SymPy as sympy.Zero.

    These sympy.Zero values are not accepted by polyclipper.scale_to_clipper() and so are raising the TypeError when checked.

    To avoid the issue I can generate new_list casting pt.x and pt.y to float:

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