Home Forums Nazca Image import: concentric shapes Reply To: Image import: concentric shapes

Wiebke Jahr

Dear Xaveer,

As you’ve seen from the registration mail, I had previously tried with pyclipper installed, but then uninstalled it when I ran into the bug. I’m pasting the original question from my email here, so anyone who runs into the issue the info also in the forum.



I’m trying to convert an image to gds. Without pyclipper installed, conversion completes, but the gds file is missing some of the structures. With pyclipper installed, I get the following error message:

4                         size = 8992, pixelsize = 2.7, threshold = 0.5,
5                         cellname = ‘SP’).put()

File ~\Anaconda3\envs\nazca\lib\site-packages\nazca\bb_util.py:1622, in image(name, layer, size, pixelsize, threshold, cellname, invert, align, box_layer, box_buf)
1620         xy = [(x0, y0), (x1, y0), (x1, y0 – p), (x0, y0 – p)]
1621         polygons.append(xy)
-> 1622 for pol in nd.clipper.merge_polygons(polygons):
1623     nd.Polygon(points=pol, layer=layer).put()
1625 if box_layer is not None:

File ~\Anaconda3\envs\nazca\lib\site-packages\nazca\clipper.py:269, in merge_polygons(paths, accuracy)
267 clipper.AddPaths(st(paths, sc), pc.PT_SUBJECT, True)
268 mp = clipper.Execute(pc.CT_UNION, pc.PFT_NONZERO, pc.PFT_NONZERO)
–> 269 mp = _clipper2GDS(mp)
270 for p in rev:
271     p.reverse()

File ~\Anaconda3\envs\nazca\lib\site-packages\nazca\clipper.py:230, in _clipper2GDS(clipper_result)
227 for i, pi in enumerate(inner):  # Remove each hole from the outer polygon
228     if i in todo and pc.PointInPolygon(pi[0], po):
229         # Subtract with tether.
–> 230         po = _subtract_polygon(po, pi)
231         todo.remove(i)
232 result.append(po)

File ~\Anaconda3\envs\nazca\lib\site-packages\nazca\clipper.py:186, in _subtract_polygon(XYo, XYi)
184     xo, yo = x, y
185 # Construct polygon
–> 186 poly = XYo[0:ndxo] + [point] + XYi[ndxi:] + XYi[0:ndxi + 1] + [point] + XYo[ndxo:]
187 return poly

UnboundLocalError: local variable ‘ndxo’ referenced before assignment


I checked the source code, and it seems it never jumps into the if-condition starting at line 180? I have two concentric circles in the design, the smaller one white, the larger one black, could they be causing the issue



    for i, (x, y) in enumerate(XYo[1:]):
# print(f”{i} -> {i+1}: {(xo, yo)} -> {x, y}”)
if yo >= yp and y <= yp and (xo < xp or x < xp):
# Line segment intersecting with horizontal.
# Calculate distance to intersection point
xi = _x_intersect((xo, yo), (x, y), yp)
d = xp – xi
if d > 0 and d < dmin:
dmin = d
ndxo = i + 1
point = (xi, yp)
xo, yo = x, y
# Construct polygon
poly = XYo[0:ndxo] + [point] + XYi[ndxi:] + XYi[0:ndxi + 1] + [point] + XYo[ndxo:]
return poly


I then tried with the new version of Nazca you sent via email and re-installed pyclipper. Indeed, the error message is gone now and conversion completes. However, the behaviour is unchanged: in the white background / black outer circle / white inner circle, only the inner circle is shown, whereas for the inverted blac background / white outer circle / black inner circle, all structures are converted.

I am now working around the problem by first inverting the .png image, and then using

nz.image(fn+”.png”, invert=True).put()

which works for my immediate problem.

Thank you!

  • This reply was modified 5 months, 3 weeks ago by Wiebke Jahr.