Beispiel #1
0
 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
Beispiel #2
0
 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
Beispiel #3
0
    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
Beispiel #5
0
    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