def getLength(self, cspath, tolerance): parts = self.getPartsFromCubicSuper(cspath) curveLen = 0 for i, part in enumerate(parts): for j, seg in enumerate(part): curveLen += bezier.bezierlength( (seg[0], seg[1], seg[2], seg[3]), tolerance=tolerance) return curveLen
def cspseglength(sp1, sp2, tolerance=0.001): bez = (sp1[1][:], sp1[2][:], sp2[0][:], sp2[1][:]) return bezierlength(bez, tolerance)
def effect(self): maxL = None separateSegs = self.options.separateSegs if (self.options.unit != 'perc' and self.options.unit != 'count'): maxL = self.options.maxLength * self.svg.unittouu( '1' + self.options.unit) # ~ inkex.errormsg(_(str(maxL))) tolerance = 10**(-1 * self.options.precision) selections = self.svg.selected pathNodes = self.document.xpath('//svg:path', namespaces=inkex.NSS) paths = [(pathNode.get('id'), CubicSuperPath(pathNode.get('d'))) for pathNode in pathNodes] if (len(paths) > 0): for key, cspath in paths: parts = getPartsFromCubicSuper(cspath) partsSplit = False for i, part in enumerate(parts): newSegs = [] for j, seg in enumerate(part): segL = bezier.bezierlength( (seg[0], seg[1], seg[2], seg[3]), tolerance=tolerance) if (maxL != None): divL = maxL elif (self.options.unit == 'perc'): divL = segL * self.options.maxLength / 100 else: divL = segL / ceil(self.options.maxLength) if (segL > divL): coveredL = 0 s = seg s1 = None s2 = DEF_ERR_MARGIN #Just in case while (not floatCmpWithMargin(segL, coveredL)): if (s == seg): sL = segL else: sL = bezier.bezierlength( (s[0], s[1], s[2], s[3]), tolerance=tolerance) if (floatCmpWithMargin(segL, coveredL + divL)): s2 = s break else: if (segL > (coveredL + divL)): t1L = divL else: t1L = segL - coveredL t1 = bezier.beziertatlength( (s[0], s[1], s[2], s[3]), l=t1L / sL, tolerance=tolerance) s1, s2 = bezier.beziersplitatt( (s[0], s[1], s[2], s[3]), t1) coveredL += t1L newSegs.append(s1) s = s2 newSegs.append(s2) else: newSegs.append(seg) if (len(newSegs) > len(part)): parts[i] = newSegs partsSplit = True if (partsSplit or separateSegs): elem = selections[key] if (separateSegs): parent = elem.getparent() idx = parent.index(elem) parent.remove(elem) allSegs = [seg for part in parts for seg in part] idSuffix = 0 for seg in allSegs: cspath = getCubicSuperFromParts([[seg]]) newElem = copy.copy(elem) oldId = newElem.get('id') newElem.set('d', CubicSuperPath(cspath)) newElem.set('id', oldId + str(idSuffix).zfill(5)) parent.insert(idx, newElem) idSuffix += 1 else: cspath = getCubicSuperFromParts(parts) elem.set('d', CubicSuperPath(cspath))
def getSegLength(seg, tolerance): if (ver == 1.0): return bezier.bezierlength(seg, tolerance=tolerance) else: return bezmisc.bezierlengthSimpson(seg, tolerance=tolerance)