Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² написаниС скриптов Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ для Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° 2.5x. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 4

Автор Thomas Larsson

bpy.ops.object.mode_set(mode='OBJECT')


ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠœΠ΅Ρ‚ΠΎΠ΄

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ добавляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π‘Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊ ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ пустым, ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΠΎΠ·ΠΆΠ΅ фактичСскими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.


β€’ ДобавляСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° bpy.ops.object.add. Он автоматичСски заботится ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π΅Ρ‰Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ…: ΠΎΠ½ создаСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ мСш ΠΈΠ»ΠΈ Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρƒ), привязываСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊ сцСнС, Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ просто, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ bpy.context.object всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ мСш-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ

bpy.ops.object.add(type='MESH')

ob = bpy.context.object

me = ob.data

ΠΈ для добавлСния Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρ‹:

bpy.ops.object.add(

type='ARMATURE',

enter_editmode=True,

location=origin)

ob = bpy.context.object

amt = ob.data


β€’ Как ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ фактичСскими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ использованиСм. Для мСша ΠΌΡ‹ добавляСм Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΈ Π³Ρ€Π°Π½ΠΈ:

me.from_pydata(verts, [], faces)

me.update()

Π° для Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΌΡ‹ добавляСм ΠΊΠΎΡΡ‚ΡŒ:

bone = amt.edit_bones.new('Bone')

bone.head = (0,0,0)

bone.tail = (0,0,1)

bpy.ops.object.mode_set(mode='OBJECT')

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ явно Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌ рСдактирования, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Π° вошла Π² Π½Π΅Π³ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈ создании.


ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²

Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаёт ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² с ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΌΠΈ свойствами.


β€’ ΠšΠΎΠ½ΡƒΡ фактичСски аппроксимируСтся ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄ΠΎΠΉ.

Для создания мСша ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Ρ‹ с 4 сторонами:

bpy.ops.mesh.primitive_cone_add(

vertices=4,

radius=1,

depth=1,

cap_end=True)

Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ добавляСт Π°Ρ€ΠΌΠ°Ρ‚ΡƒΡ€Ρƒ с СдинствСнной ΠΊΠΎΡΡ‚ΡŒΡŽ:

bpy.ops.object.armature_add()

bpy.ops.transform.translate(value=origin)


β€’ Как ΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, ΠΌΡ‹ Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ вновь созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· bpy.context.object.

ob = bpy.context.object

me = ob.data


Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² самый простой, Π½ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² доступСн. Π”Π°ΠΆΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΎΠ½ создаСт мСш ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отличаСтся ΠΎΡ‚ созданных Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ двумя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ: основаниС Π½Π΅ являСтся СдинствСнным Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ…ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ, Π° состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² с ΠΎΠ±Ρ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² сСрСдинС основания. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ эквивалСнтны.

ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ² Π½Π΅ обязан Π±Ρ‹Ρ‚ΡŒ особСнно простым; Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ для создания мСша ΠΎΠ±Π΅Π·ΡŒΡΠ½Ρ‹ ΠΈΠ»ΠΈ чСловСчСская оснастка. Но ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² всСгда ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π·Π°Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ всС Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π² этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅.



#----------------------------------------------------------

# File objects.py

#----------------------------------------------------------

import bpy

import mathutils

from mathutils import Vector 


def createMeshFromData(name, origin, verts, faces):

    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мСша ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

    me = bpy.data.meshes.new(name+'Mesh')

    ob = bpy.data.objects.new(name, me)

    ob.location = origin ob.show_name = True


    # ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ сцСнС, ΠΎΠ½ становится Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ

    scn = bpy.context.scene

    scn.objects.link(ob)

    scn.objects.active = ob

    ob.select = True


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мСша ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… verts (Π²Π΅Ρ€ΡˆΠΈΠ½), faces (Π³Ρ€Π°Π½Π΅ΠΉ).

    me.from_pydata(verts, [], faces)

    # ОбновлСниС мСша с Π½ΠΎΠ²Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

    me.update()

    return ob 


def createMeshFromOperator(name, origin, verts, faces):

    bpy.ops.object.add(

        type='MESH',

        enter_editmode=False,

        location=origin)

    ob = bpy.context.object

    ob.name = name

    ob.show_name = True

    me = ob.data me.name = name+'Mesh'


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мСша ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… verts (Π²Π΅Ρ€ΡˆΠΈΠ½), faces (Π³Ρ€Π°Π½Π΅ΠΉ).

    me.from_pydata(verts, [], faces)

    # ОбновлСниС мСша с Π½ΠΎΠ²Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

    me.update()

    # Установка Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

    bpy.ops.object.mode_set(mode='OBJECT')

    return ob 


def createMeshFromPrimitive(name, origin):

    bpy.ops.mesh.primitive_cone_add(

        vertices=4,

        radius=1,

        depth=1,

        cap_end=True,

        view_align=False,

        enter_editmode=False,

        location=origin,

        rotation=(0, 0, 0))


    ob = bpy.context.object

    ob.name = name

    ob.show_name = True

    me = ob.data

    me.name = name+'Mesh'

    return ob 


def createArmatureFromData(name, origin):

    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мСша ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

    amt = bpy.data.armatures.new(name+'Amt')

    ob = bpy.data.objects.new(name, amt)

    ob.location = origin

    ob.show_name = True


    # ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊ сцСнС, ΠΎΠ½ становится Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ

    scn = bpy.context.scene

    scn.objects.link(ob)

    scn.objects.active = ob

    ob.select = True


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ кости

    bpy.ops.object.mode_set(mode='EDIT')

    bone = amt.edit_bones.new('Bone')

    bone.head = (0,0,0)

    bone.tail = (0,0,1)

    bpy.ops.object.mode_set(mode='OBJECT')

    return ob 


def createArmatureFromOperator(name, origin):

    bpy.ops.object.add(

        type='ARMATURE',

        enter_editmode=True,

        location=origin)

    ob = bpy.context.object

    ob.name = name

    ob.show_name = True

    amt = ob.data

    amt.name = name+'Amt'


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ кости

    bone = amt.edit_bones.new('Bone')

    bone.head = (0,0,0)

    bone.tail = (0,0,1)

    bpy.ops.object.mode_set(mode='OBJECT')

    return ob 


def createArmatureFromPrimitive(name, origin):

    bpy.ops.object.armature_add()

    bpy.ops.transform.translate(value=origin)

    ob = bpy.context.object

    ob.name = name

    ob.show_name = True

    amt = ob.data

    amt.name = name+'Amt'

    return ob 


def run(origo):

    origin = Vector(origo)

    (x,y,z) = (0.707107, 0.258819, 0.965926)

    verts = ((x,x,-1), (x,-x,-1), (-x,-x,-1), (-x,x,-1), (0,0,1))

    faces = ((1,0,4), (4,2,1), (4,3,2), (4,0,3), (0,1,2,3))


    cone1 = createMeshFromData('DataCone', origin, verts, faces)

    cone2 = createMeshFromOperator('OpsCone', origin+Vector((0,2,0)), verts, faces)

    cone3 = createMeshFromPrimitive('PrimCone', origin+Vector((0,4,0)))


    rig1 = createArmatureFromData('DataRig', origin+Vector((0,6,0)))

    rig2 = createArmatureFromOperator('OpsRig', origin+Vector((0,8,0)))

    rig3 = createArmatureFromPrimitive('PrimRig', origin+Vector((0,10,0)))

    return 


if __name__ == "__main__":

    run((0,0,0))



ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΈ тСкстуры

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° добавляСт красный Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΠΈ синий ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ, ΠΈ Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΈΡ…, соотвСтствСнно, ΠΊΡƒΠ±Ρƒ ΠΈ сфСрС.



#----------------------------------------------------------

# File material.py

#----------------------------------------------------------

import bpy 

def makeMaterial(name, diffuse, specular, alpha):

    mat = bpy.data.materials.new(name)

    mat.diffuse_color = diffuse

    mat.diffuse_shader = 'LAMBERT'

    mat.diffuse_intensity = 1.0

    mat.specular_color = specular

    mat.specular_shader = 'COOKTORR'

    mat.specular_intensity = 0.5

    mat.alpha = alpha

    mat.ambient = 1

    return mat 


def setMaterial(ob, mat):

    me = ob.data

    me.materials.append(mat)  


def run(origin):

    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ²

    red = makeMaterial('Red', (1,0,0), (1,1,1), 1)

    blue = makeMaterial('BlueSemi', (0,0,1), (0.5,0.5,0), 0.5)


    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ синСго ΠΊΡƒΠ±Π°

    bpy.ops.mesh.primitive_cube_add(location=origin)

    setMaterial(bpy.context.object, red)


    # ΠΈ красной сфСры

    bpy.ops.mesh.primitive_uv_sphere_add(location=origin)

    bpy.ops.transform.translate(value=(1,0,0))

    setMaterial(bpy.context.object, blue)  


if __name__ == "__main__":

   run((0,0,0))


ВСкстуры

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» с двумя тСкстурами: тСкстура image, отобраТаСмая Π½Π° Ρ†Π²Π΅Ρ‚ ΠΈ Π°Π»ΡŒΡ„Ρƒ, ΠΈ процСдурная bump-тСкстура. (ΠœΠΎΠΆΠ΅Ρ‚ я Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ нСдопонимаю, Π½ΠΎ ΠΈΡ… Ρ‚Π°ΠΌ Ρ‚Ρ€ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ... - ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.)



Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот рисунок ΠΊΠ°ΠΊ тСкстуру ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ имя Π½Π° color.png:



#----------------------------------------------------------

# File texture.py

#----------------------------------------------------------

import bpy, os 


def run(origin):

 # Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π° с рисунком. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ здСсь, Ссли ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ snippets