def readXML(ifile): """ Read a list of Polygons from a XML file which was written with writeXML(). :Arguments: - ofile: see above :Returns: list of Polygon objects """ f, cl = getReadableObject(ifile) d = parseString(f.read()) if cl: f.close() plist = [] for pn in d.getElementsByTagName('polygon'): p = Polygon() plist.append(p) for sn in pn.childNodes: if not sn.nodeType == Node.ELEMENT_NODE: continue assert sn.tagName == 'contour' polist = [] for pon in sn.childNodes: if not pon.nodeType == Node.ELEMENT_NODE: continue polist.append((float(pon.getAttribute('x')), float(pon.getAttribute('y')))) assert int(sn.getAttribute('points')) == len(polist) p.addContour(polist, int(sn.getAttribute('isHole'))) assert int(pn.getAttribute('contours')) == len(p) return plist
def prunePoints(poly): """ Returns a new Polygon which has exactly the same shape as p, but unneeded points are removed. The new Polygon has no double points or points that are exactly on a straight line. :Arguments: - p: Polygon :Returns: new Polygon """ np = Polygon() for x in range(len(poly)): # loop over contours c = list(poly[x]) c.insert(0, c[-1]) c.append(c[1]) # remove double points i = 1 while (i < (len(c))): if c[i] == c[i-1]: del c[i] else: i += 1 # remove points that are on a straight line n = [] for i in range(1, len(c)-1): if __linVal(c[i-1:i+2]) != 0.0: n.append(c[i]) if len(n) > 2: np.addContour(n, poly.isHole(x)) return np
def fillHoles(poly): """ Returns the polygon p without any holes. :Arguments: - p: Polygon :Returns: new Polygon """ n = Polygon() [n.addContour(poly[i]) for i in range(len(poly)) if poly.isSolid(i)] return n
def decodeBinary(bin): """ Create Polygon from a binary string created with encodeBinary(). If the string is not valid, the whole thing may break! :Arguments: - s: string :Returns: new Polygon """ nC, b = __unpack('!I', bin) p = Polygon() for i in range(nC[0]): x, b = __unpack('!l', b) if x[0] < 0: isHole = 1 s = -2*x[0] else: isHole = 0 s = 2*x[0] flat, b = __unpack('!%dd' % s, b) p.addContour(tuple(__couples(flat)), isHole) return p
def decodeBinary(bin): """ Create Polygon from a binary string created with encodeBinary(). If the string is not valid, the whole thing may break! :Arguments: - s: string :Returns: new Polygon """ nC, b = __unpack('!I', bin) p = Polygon() for i in range(nC[0]): x, b = __unpack('!l', b) if x[0] < 0: isHole = 1 s = -2 * x[0] else: isHole = 0 s = 2 * x[0] flat, b = __unpack('!%dd' % s, b) p.addContour(tuple(__couples(flat)), isHole) return p