def sv_main(Points=[], SourceTri=[], TargetTri=[]):

    in_sockets = [
        ['v', 'Points', Points],
        ['v', 'SourceTri', SourceTri],
        ['v', 'TargetTri', TargetTri]

        ]

    import mathutils
    from sverchok.data_structure import (match_long_cycle)

    out = []
    if SourceTri and TargetTri and Points:

        Points, SourceTri, TargetTri = match_long_cycle([Points, SourceTri, TargetTri])

        g = 0
        while g < len(Points):

            st = SourceTri[g][:3]
            tt = TargetTri[g][:3]
            P = Points[g]

            out.append([mathutils.geometry.barycentric_transform(i, st[0], st[1], st[2], tt[0], tt[1], tt[2])[:] for i in P])

            g = g+1

    out_sockets = [
        ['v', 'TransformedPoints', out]
    ]

    return in_sockets, out_sockets
def sv_main(Points=[], SourceTri=[], TargetTri=[]):

    in_sockets = [['v', 'Points', Points], ['v', 'SourceTri', SourceTri],
                  ['v', 'TargetTri', TargetTri]]

    import mathutils
    from sverchok.data_structure import (match_long_cycle)

    out = []
    if SourceTri and TargetTri and Points:

        Points, SourceTri, TargetTri = match_long_cycle(
            [Points, SourceTri, TargetTri])

        g = 0
        while g < len(Points):

            st = SourceTri[g][:3]
            tt = TargetTri[g][:3]
            P = Points[g]

            out.append([
                mathutils.geometry.barycentric_transform(
                    i, st[0], st[1], st[2], tt[0], tt[1], tt[2])[:] for i in P
            ])

            g = g + 1

    out_sockets = [['v', 'TransformedPoints', out]]

    return in_sockets, out_sockets
예제 #3
0
    def Do_vecs(self, Vecs, Edgs, Diameter, Shape, Size,
                Cup):  #Offset,Extrude):
        if Shape == 'Square':
            Nsides = 4
            Diameter = Diameter * sqrt(2) / 2
            Sides = 90
        else:
            Nsides = 12
            Diameter = Diameter / 2
            Sides = 30

        outv = []
        outp = []
        for E, V in zip(Edgs, Vecs):
            outv_ = []
            outp_ = []
            k = 0
            Size, E = match_long_cycle([Size, E])
            for e, S in zip(E, Size):
                S0, S1, S2 = S
                S2 = (S2 - 1) / 2
                circle = [ (Vector((sin(radians(i))*S0,cos(radians(i))*S1,0))*Diameter) \
                            for i in range(45,405,Sides) ]
                v2, v1 = Vector(V[e[1]]), Vector(V[e[0]])
                vecdi = v2 - v1
                matrix_rot = vecdi.rotation_difference(Vector(
                    (0, 0, 1))).to_matrix().to_4x4()
                verts1 = [(ve * matrix_rot + v1 - vecdi * S2)[:]
                          for ve in circle]
                verts2 = [(ve * matrix_rot + v2 + vecdi * S2)[:]
                          for ve in circle]
                outv_.extend(verts1)
                outv_.extend(verts2)
                pols = [[
                    k + i + 0, k + i - 1, k + i + Nsides - 1, k + i + Nsides
                ] for i in range(1, Nsides, 1)]
                pols.append(
                    [k + 0, k + Nsides - 1, k + Nsides * 2 - 1, k + Nsides])
                if Cup:
                    p1 = [
                        k + i - Nsides for i in reversed(range(1, Nsides, 1))
                    ]
                    p2 = [k + i for i in range(1, Nsides, 1)]
                    p2.append(k)
                    p1.append(k - Nsides)
                    pols.append(p1)
                    pols.append(p2)

                if self.close and k != 0:
                    p = [[
                        k + i + 0 - Nsides, k + i - 1 - Nsides, k + i - 1,
                        k + i
                    ] for i in range(1, Nsides, 1)]
                    pols.extend(p)
                    pols.append([k + 0 - Nsides, k - 1, k + Nsides - 1, k])
                outp_.extend(pols)
                k += Nsides * 2
            outv.append(outv_)
            outp.append(outp_)
        return outv, outp
예제 #4
0
def sv_recursion(function, verts1, verts2, multiplyer, separate, level):
    ''' recursion itself
    function defined at node
    func - definition
    verts1,2 - operating verts
    multiplyer - as named
    separate - boolean to group vertices
    level - depth of verts1,2 '''
    if not separate:
        if level:
            multiplyer, verts1, verts2 = match_long_cycle(
                [multiplyer, verts1, verts2])
            out = []
            outa = out.append
            oute = out.extend
            for v1, v2, m in zip(verts1, verts2, multiplyer):
                out_ = sv_recursion(function, v1, v2, m, separate, level - 1)
                if level > 1:
                    outa(out_)
                elif level == 1:
                    oute(out_)
            return out
        else:
            return function(verts1, verts2, multiplyer)
    else:
        if level:
            multiplyer, verts2 = match_long_cycle([multiplyer, verts2])
            out = []
            outa = out.append
            oute = out.extend
            if level > 1:
                for v1, v2, m in zip(verts1, verts2, multiplyer):
                    out_ = sv_recursion(function, v1, v2, m, separate,
                                        level - 1)
                    outa(out_)
            elif level == 1:
                for v2, m in zip(verts2, multiplyer):
                    out_ = []
                    for v1 in verts1:
                        out_.extend(function(v1, v2, m))
                    oute([out_])
            return out
예제 #5
0
def sv_recursion(function, verts1, verts2, multiplyer, separate, level):
    ''' recursion itself
    function defined at node
    func - definition
    verts1,2 - operating verts
    multiplyer - as named
    separate - boolean to group vertices
    level - depth of verts1,2 '''
    if not separate:
        if level:
            multiplyer,verts1,verts2 = match_long_cycle([multiplyer,verts1,verts2])
            out = []
            outa = out.append
            oute = out.extend
            for v1,v2,m in zip(verts1, verts2, multiplyer):
                out_ = sv_recursion(function, v1,v2,m,separate, level-1)
                if level > 1:
                    outa(out_)
                elif level == 1:
                    oute(out_)
            return out
        else:
            return function(verts1,verts2,multiplyer)
    else:
        if level:
            multiplyer,verts2 = match_long_cycle([multiplyer,verts2])
            out = []
            outa = out.append
            oute = out.extend
            if level > 1:
                for v1,v2,m in zip(verts1, verts2, multiplyer):
                    out_ = sv_recursion(function, v1,v2,m,separate, level-1)
                    outa(out_)
            elif level == 1:
                for v2,m in zip(verts2,multiplyer):
                    out_ = []
                    for v1 in verts1:
                        out_.extend(function(v1,v2,m))
                    oute([out_])
            return out
예제 #6
0
    def Do_vecs(self, Vecs,Edgs,Diameter,Shape,Size,Cup): #Offset,Extrude):
        if Shape == 'Square':
            Nsides = 4
            Diameter = Diameter*sqrt(2)/2
            Sides = 90
        else:
            Nsides = 12
            Diameter = Diameter/2
            Sides = 30

        outv = []
        outp = []
        for E,V in zip(Edgs,Vecs):
            outv_ = []
            outp_ = []
            k = 0
            Size, E = match_long_cycle([Size,E])
            for e,S in zip(E,Size):
                S0,S1,S2 = S
                S2 = (S2-1)/2
                circle = [ (Vector((sin(radians(i))*S0,cos(radians(i))*S1,0))*Diameter) \
                            for i in range(45,405,Sides) ]
                v2,v1 = Vector(V[e[1]]),Vector(V[e[0]])
                vecdi = v2-v1
                matrix_rot = vecdi.rotation_difference(Vector((0,0,1))).to_matrix().to_4x4()
                verts1 = [ (ve*matrix_rot+v1-vecdi*S2)[:] for ve in circle ]
                verts2 = [ (ve*matrix_rot+v2+vecdi*S2)[:] for ve in circle ]
                outv_.extend(verts1)
                outv_.extend(verts2)
                pols = [ [k+i+0,k+i-1,k+i+Nsides-1,k+i+Nsides] for i in range(1,Nsides,1) ]
                pols.append([k+0,k+Nsides-1,k+Nsides*2-1,k+Nsides])
                if Cup:
                    p1 = [ k+i-Nsides for i in reversed(range(1,Nsides,1)) ]
                    p2 = [ k+i for i in range(1,Nsides,1) ]
                    p2.append(k)
                    p1.append(k-Nsides)
                    pols.append(p1)
                    pols.append(p2)
                    
                if self.close and k!=0:
                    p = [ [k+i+0-Nsides,k+i-1-Nsides,k+i-1,k+i] for i in range(1,Nsides,1) ]
                    pols.extend(p)
                    pols.append([k+0-Nsides,k-1,k+Nsides-1,k])
                outp_.extend(pols)
                k += Nsides*2
            outv.append(outv_)
            outp.append(outp_)
        return outv, outp
def area_calc_setup(pols):
    '''Analyze pols information'''

    np_pols = np.array(pols)
    p_len = len(pols)
    if np_pols.dtype == np.object:
        np_len = np.vectorize(len)
        pols_sides = np_len(np_pols)
        pols_sides_max = np.amax(pols_sides)
        pols = match_long_cycle(pols)
        np_pols = np.array(pols)
        p_non_regular = True
    else:
        p_non_regular = False
        pols_sides = np.array(p_len)
        pols_sides_max = len(pols[0])

    return [np_pols, pols_sides_max, pols_sides, p_len, p_non_regular]
예제 #8
0
def area_calc_setup(pols):
    '''Analyze pols information'''

    np_pols = np.array(pols)
    p_len = len(pols)
    if np_pols.dtype == np.object:
        np_len = np.vectorize(len)
        pols_sides = np_len(np_pols)
        pols_sides_max = np.amax(pols_sides)
        pols = match_long_cycle(pols)
        np_pols = np.array(pols)
        p_non_regular = True
    else:
        p_non_regular = False
        pols_sides = np.array(p_len)
        pols_sides_max = len(pols[0])

    return [np_pols, pols_sides_max, pols_sides, p_len, p_non_regular]
def sv_main(V=[], P=[[]], S=[], T=[]):

    in_sockets = [['v', 'Points', V], ['s', 'Polys', P], ['v', 'SourceTri', S],
                  ['v', 'TargetTri', T]]

    outV, outP = [], []
    if V and S and T:
        v, p, s, t = match_long_cycle([V, P, S, T])
        for v, p, s, t in zip(v, p, s, t):
            outV.append([
                mathutils.geometry.barycentric_transform(
                    i, s[0], s[1], s[2], t[0], t[1], t[2])[:] for i in v
            ])
            outP.append(p)

    out_sockets = [['v', 'TransformedPoints', outV], ['s', 'Polygons', outP]]

    return in_sockets, out_sockets
예제 #10
0
    def process(self):

        vertex_weight = self.inputs['Weights'].links
        if not (vertex_weight and
                (type(vertex_weight[0].from_socket) == StringsSocket)):
            return

        obj = bpy.data.objects[self.formula]

        if self.inputs['VertIND'].links:
            verts = SvGetSocketAnyType(self, self.inputs['VertIND'])[0]
        else:
            verts = [i.index for i in obj.data.vertices]

        wei = SvGetSocketAnyType(self, self.inputs['Weights'])[0]

        if self.Iteration == 'match_short':
            temp = match_short([verts, wei])
            verts, wei = temp[0], temp[1]
        if self.Iteration == 'match_long_cycle':
            temp = match_long_cycle([verts, wei])
            verts, wei = temp[0], temp[1]

        obj.data.update()
        if obj.vertex_groups.active and\
           obj.vertex_groups.active.name.find('Sv_VGroup') != -1:

            if self.clear:
                obj.vertex_groups.active.add(
                    [i.index for i in obj.data.vertices], self.fade_speed,
                    "SUBTRACT")
            g = 0
            while g != len(wei):
                obj.vertex_groups.active.add([verts[g]], wei[g], "REPLACE")
                g = g + 1

        else:
            obj.vertex_groups.active = obj.vertex_groups.new(name='Sv_VGroup')
def sv_main(V=[], P=[[]], S=[], T=[]):

    in_sockets = [
        ['v', 'Points', V],
        ['s', 'Polys', P],
        ['v', 'SourceTri', S],
        ['v', 'TargetTri', T]

        ]

    outV,outP = [],[]
    if V and S and T:
        v,p,s,t = match_long_cycle([V,P,S,T])
        for v,p,s,t in zip(v,p,s,t):
            outV.append([mathutils.geometry.barycentric_transform(i, s[0], s[1], s[2], t[0], t[1], t[2])[:] for i in v])
            outP.append(p)

    out_sockets = [
        ['v', 'TransformedPoints', outV],
        ['s', 'Polygons', outP]
    ]

    return in_sockets, out_sockets
예제 #12
0
def list_matcher(a, list_match):

    if list_match == "Long Cycle":
        return match_long_cycle(a)
    else:
        return match_long_repeat(a)