def vert_line(self, x, xlat, bbox): """Create a vertical line""" line = PathElement() x = x - xlat[0] * self.options.xoffset y1 = bbox.top - xlat[1] * self.options.yoffset y2 = bbox.bottom line.set('d', 'M %f %f V %f' % (x, y1, y2)) return line
def horz_line(self, y, xlat, bbox): """Create a horzontal line""" line = PathElement() x1 = bbox.left - xlat[0] * self.options.xoffset x2 = bbox.right y1 = y - xlat[1] * self.options.yoffset line.set('d', 'M %f %f H %f' % (x1, y1, x2)) return line
def test_path_horizontal_line_stroke_square_cap(self): path = PathElement() path.set_path("M 0 0 " "L 1 0") stroke_half_width = 1.0 path.style = Style("stroke-width:{};stroke:red".format(stroke_half_width * 2)) path.set("stroke-linecap", "square") self.assert_bounding_box_is_equal(path, (-stroke_half_width, 1 + stroke_half_width), (-stroke_half_width, stroke_half_width))
def render_path(self, pointStr): singlePath = self.get_icon_path_str(pointStr) pathStr = "" for row in range(self.draw.row_count()): for col in range(self.draw.col_count()): if self.draw.isDark(col, row): x, y = self.get_svg_pos(col, row) pathStr += "M %f,%f " % (x, y) + singlePath + " z " path = PathElement() path.set('d', pathStr) return path
def add_marker(self, name, rotate): """Create a marker in the defs of the svg""" marker = Marker() marker.set('id', name) marker.set('orient', 'auto') marker.set('refX', '0.0') marker.set('refY', '0.0') marker.set('style', 'overflow:visible') marker.set('inkscape:stockid', name) self.svg.defs.append(marker) arrow = PathElement( d='M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z ') if rotate: arrow.set('transform', 'scale(0.8) rotate(180) translate(12.5,0)') else: arrow.set('transform', 'scale(0.8) translate(12.5,0)') arrow.set( 'style', 'fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none' ) marker.append(arrow)
def render_adv(self, greedy): verts = self.draw.createVertexesForAdvDrawer() qrPathStr = "" while len(verts) > 0: vertsIndexStart = len(verts) - 1 vertsIndexCur = vertsIndexStart ringIndexes = [] while True: ringIndexes.append(vertsIndexCur) nextPos = self.draw.moveByDirection(verts[vertsIndexCur]) nextIndexes = [ i for i, x in enumerate(verts) if x[0] == nextPos[0] and x[1] == nextPos[1] ] if len(nextIndexes) == 0 or len(nextIndexes) > 2: raise Exception("Vertex " + str(next_c) + " has no connections") elif len(nextIndexes) == 1: vertsIndexNext = nextIndexes[0] else: if {verts[nextIndexes[0]][2], verts[nextIndexes[1]][2] } != {(verts[vertsIndexCur][2] - 1) % 4, (verts[vertsIndexCur][2] + 1) % 4}: raise Exception("Bad next vertex directions " + str(verts[nextIndexes[0]]) + str(verts[nextIndexes[1]])) # Greedy - CCW turn, proud and neutral CW turn vertsIndexNext = nextIndexes[0] if ( greedy == "g") == (verts[nextIndexes[0]][2] == (verts[vertsIndexCur][2] + 1) % 4) else nextIndexes[1] if vertsIndexNext == vertsIndexStart: break vertsIndexCur = vertsIndexNext posStart, _ = self.draw.getSmoothPosition(verts[ringIndexes[0]]) qrPathStr += "M %f,%f " % self.get_svg_pos(posStart[0], posStart[1]) for ri in range(len(ringIndexes)): vc = verts[ringIndexes[ri]] vn = verts[ringIndexes[(ri + 1) % len(ringIndexes)]] if vn[2] != vc[2]: if (greedy != "n") or not vn[3]: # Add bezier # Opt length http://spencermortensen.com/articles/bezier-circle/ # c = 0.552284749 ex = 1 - 0.552284749 _, bs = self.draw.getSmoothPosition(vc) _, bp1 = self.draw.getSmoothPosition(vc, ex) bp2, _ = self.draw.getSmoothPosition(vn, ex) bf, _ = self.draw.getSmoothPosition(vn) qrPathStr += "L %f,%f " % self.get_svg_pos( bs[0], bs[1]) qrPathStr += "C %f,%f %f,%f %f,%f " \ % (self.get_svg_pos(bp1[0], bp1[1]) + self.get_svg_pos(bp2[0], bp2[1]) + self.get_svg_pos(bf[0], bf[1])) else: # Add straight qrPathStr += "L %f,%f " % self.get_svg_pos( vn[0], vn[1]) qrPathStr += "z " # Delete already processed vertex for i in sorted(ringIndexes, reverse=True): del verts[i] path = PathElement() path.set('d', qrPathStr) return path