Example #1
0
    def shade(self, stroke):
        # save the location and attribute of stroke vertices
        buffer = tuple(
            (Vector(sv.point), StrokeAttribute(sv.attribute)) for sv in stroke)
        nverts = len(buffer)
        if nverts < 2:
            return
        # calculate the number of additional vertices to form caps
        caplen_beg = sum(stroke[0].attribute.thickness) / 2.0
        nverts_beg = 1

        caplen_end = sum(stroke[-1].attribute.thickness) / 2.0
        nverts_end = 1
        # adjust the total number of stroke vertices
        stroke.resample(nverts + nverts_beg + nverts_end)
        # restore the location and attribute of the original vertices
        for i, (p, attr) in zip(range(nverts), buffer):
            stroke[nverts_beg + i].point = p
            stroke[nverts_beg + i].attribute = attr
        # reshape the cap at the beginning of the stroke
        q, attr = buffer[1]
        p, attr = buffer[0]
        stroke[0].point += (p - q).normalized() * caplen_beg
        stroke[0].attribute = attr
        # reshape the cap at the end of the stroke
        q, attr = buffer[-2]
        p, attr = buffer[-1]
        stroke[-1].point += (p - q).normalized() * caplen_end
        stroke[-1].attribute = attr
        # update the curvilinear 2D length of each vertex
        stroke.update_length()
Example #2
0
 def shade(self, stroke):
     originalSize = stroke.stroke_vertices_size()
     if originalSize < 4:
         return
     verticesToRemove = []
     oldAttributes = []
     it = stroke.stroke_vertices_begin()
     while not it.is_end:
         v = it.object
         if v.curvilinear_abscissa < self._l or v.stroke_length - v.curvilinear_abscissa < self._l:
             verticesToRemove.append(v)
         oldAttributes.append(StrokeAttribute(v.attribute))
         it.increment()
     if originalSize - len(verticesToRemove) < 2:
         return
     for sv in verticesToRemove:
         stroke.remove_vertex(sv)
     stroke.update_length()
     stroke.resample(originalSize)
     if stroke.stroke_vertices_size() != originalSize:
         print("pyTipRemover: Warning: resampling problem")
     it = stroke.stroke_vertices_begin()
     for a in oldAttributes:
         if it.is_end:
             break
         it.object.attribute = a
         it.increment()
     stroke.update_length()
Example #3
0
    def shade(self, stroke):
        # save the location and attribute of stroke vertices
        buffer = tuple(
            (Vector(sv.point), StrokeAttribute(sv.attribute)) for sv in stroke)
        nverts = len(buffer)
        if nverts < 2:
            return
        # calculate the number of additional vertices to form caps
        thickness_beg = sum(stroke[0].attribute.thickness)
        caplen_beg = thickness_beg / 2.0
        nverts_beg = max(5, int(thickness_beg))

        thickness_end = sum(stroke[-1].attribute.thickness)
        caplen_end = (thickness_end) / 2.0
        nverts_end = max(5, int(thickness_end))

        # adjust the total number of stroke vertices
        stroke.resample(nverts + nverts_beg + nverts_end)
        # restore the location and attribute of the original vertices
        for i, (p, attr) in enumerate(buffer):
            stroke[nverts_beg + i].point = p
            stroke[nverts_beg + i].attribute = attr
        # reshape the cap at the beginning of the stroke
        q, attr = buffer[1]
        p, attr = buffer[0]
        direction = (p - q).normalized() * caplen_beg
        n = 1.0 / nverts_beg
        R, L = attr.thickness
        for t, svert in zip(range(nverts_beg, 0, -1), stroke):
            r = self.round_cap_thickness((t + 1) * n)
            svert.point = p + direction * t * n
            svert.attribute = attr
            svert.attribute.thickness = (R * r, L * r)
        # reshape the cap at the end of the stroke
        q, attr = buffer[-2]
        p, attr = buffer[-1]
        direction = (p - q).normalized() * caplen_beg
        n = 1.0 / nverts_end
        R, L = attr.thickness
        for t, svert in zip(range(nverts_end, 0, -1), reversed(stroke)):
            r = self.round_cap_thickness((t + 1) * n)
            svert.point = p + direction * t * n
            svert.attribute = attr
            svert.attribute.thickness = (R * r, L * r)
        # update the curvilinear 2D length of each vertex
        stroke.update_length()
Example #4
0
    def shade(self, stroke):
        n = len(stroke)
        if n < 4:
            return

        verticesToRemove = tuple(svert for svert in stroke if self.check_vertex(svert, self._l))
        # explicit conversion to StrokeAttribute is needed
        oldAttributes = (StrokeAttribute(svert.attribute) for svert in stroke)

        if n - len(verticesToRemove) < 2:
            return

        for sv in verticesToRemove:
            stroke.remove_vertex(sv)

        stroke.update_length()
        stroke.resample(n)
        if len(stroke) != n and bpy.app.debug_freestyle:
            print("pyTipRemover: Warning: resampling problem")

        for svert, a in zip(stroke, oldAttributes):
            svert.attribute = a
        stroke.update_length()