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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «НаписаниС скриптов для Blender 2.49Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 20

Автор Michel Anders

Один вопрос ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ нуТдаСтся Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ: символ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅, Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ‚Π°ΠΊΠΎΠ³ΠΎ символа, Ρ‚Π°ΠΊΠΎΠΉ Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ снаруТи внСшнСй Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ символа, Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ любой Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли ΠΌΡ‹ создаСм Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ», ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ, Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ кривая Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ являСтся внСшнСй Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ, ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ создан Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΡ€ΠΈΠ²ΠΎΠΉ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, наша функция expand() (показанная Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ кускС ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Tools.py. На самом Π΄Π΅Π»Π΅ эта ΠΈ всС Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Сю Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ находятся Π² Ρ„Π°ΠΉΠ»Π΅ expand.py β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.), Π±Π΅Ρ€Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ plist, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся списком списков, содСрТащих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ MVert, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΠ³ΠΎΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ. Если пСрвая Ρ‚ΠΎΡ‡ΠΊΠ° ΠΊΡ€ΠΈΠ²ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ, Π»Π΅ΠΆΠΈΡ‚ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… любой ΠΈΠ· этих Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΡ€ΠΈΠ²Ρ‹Ρ…, ΠΌΡ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ кривая, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ, являСтся Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΊΡ€ΠΈΠ²ΠΎΠΉ. (Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ссли внутрСнняя кривая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒ внСшнюю ΠΊΡ€ΠΈΠ²ΡƒΡŽ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅, Π½ΠΎ для ΠΊΡ€ΠΈΠ²Ρ‹Ρ…, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… символ Π² ΡˆΡ€ΠΈΡ„Ρ‚Π΅, Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ происходит.)

def expand(me,loop,offset=0.05,plist=[]):

   ov = [me.verts[i] for i in verts_from_edgeloop(loop)]


   inside=False

   for polygon in plist:

      if in_polygon(loop[0].v1.co,polygon):

         inside=True

         break   # ΠΌΡ‹ Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π» с нСсколькими

Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ


   n=len(ov)

   points=[]

   for i in range(n):

      va = (ov[i].co-ov[(i+1)%n].co).normalize()

      vb = (ov[i].co-ov[(i-1)%n].co).normalize()

      cosa=abs(vec(va).dot(vb))

      if cosa>0.99999 :   # ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠΎΠ»Π»ΠΈΠ½Π΅Π°Ρ€Π½Ρ‹

         c = vec(va[1],va[0],va[2])

      else:

         c = va+vb

      l = offset/c.length

      p = ov[i].co+l*c

      if in_polygon(p,ov) != inside:

         p = ov[i].co-l*c

      print i,ov[i].co,va,vb,c,l,cosa,p

      points.append(p)


   return points

Π’Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π² Tools.py), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Ρ€Ρ‘Π±Π΅Ρ€, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ», ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ отсортированный список Π²Π΅Ρ€ΡˆΠΈΠ½. Π­Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ наша функция in_polygon() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ список Π²Π΅Ρ€ΡˆΠΈΠ½, Π° Π½Π΅ Ρ€Ρ‘Π±Π΅Ρ€, ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ этот список отсортирован, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ смСТныС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ Ρ€Ρ‘Π±Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, находится Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, опрСдСляСмого списком Π²Π΅Ρ€ΡˆΠΈΠ½, ΠΌΡ‹ считаСм количСство Ρ€Ρ‘Π±Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ Π»ΠΈΠ½ΠΈΠ΅ΠΉ (часто Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π»ΡƒΡ‡ΠΎΠΌ), которая начинаСтся Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΈ распространяСтся Π΄ΠΎ бСсконСчности. Если количСство пСрСсСкаСмых Ρ€Ρ‘Π±Π΅Ρ€ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Ρ‚ΠΎΡ‡ΠΊΠ° Π»Π΅ΠΆΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°; Ссли Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, ΠΎΠ½Π° Π»Π΅ΠΆΠΈΡ‚ снаруТи ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ рисунок ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ:



Ѐункция in_polygon(), показанная здСсь - Ρ‡Π°ΡΡ‚ΡŒ Tools.py. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΡƒ (Π’Π΅ΠΊΡ‚ΠΎΡ€) ΠΈ список Π²Π΅Ρ€ΡˆΠΈΠ½ (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ MVert) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Π˜ΡΡ‚ΠΈΠ½Ρƒ ΠΈΠ»ΠΈ Π›ΠΎΠΆΡŒ. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ любая z-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Ρƒ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈΠ»ΠΈ Ρƒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π² ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

from Blender.Geometry import LineIntersect2D

from Blender.Mathutils import Vector as vec

def in_polygon(p,polygon):

   intersections = 0

   n = len(polygon)

   if n<3 : return False

   for i in range(n):

      if LineIntersect2D (p,vec(1.0,0.0,0.0),polygon[i].

co,polygon[(i+1)%n].co):

         intersections+=1

   return intersections % 2 == 1

Врудная Π·Π°Π΄Π°Ρ‡Π° выполняСтся Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ строкС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ LineIntersect2D(), доступной Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Blender.Geometry. ДСйствиС Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ (%) Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ return - способ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ Π»ΠΈ количСство пСрСсСчСний.


Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ всё вмСстС: Engrave.py

Π’ΠΎΠΎΡ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅   всСми   Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ   функциями, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… сСкциях, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ список шагов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π³Ρ€Π°Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ тСкст:

1. ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ мСню для Π²Π²ΠΎΠ΄Π° строки, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π΄ΠΎ Π³Ρ€Π°Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - мСш, ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ Π³Ρ€Π°Π½ΠΈ.

3. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Text3d.

(Π½Π° самом Π΄Π΅Π»Π΅ скрипт engrave.py Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Text3d ΡƒΠΆΠ΅ Π±Ρ‹Π» создан ΠΈ Π²Ρ‹Π±Ρ€Π°Π½ ΠΊΠ°ΠΊ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 3 ΠΏΡƒΠ½ΠΊΡ‚Π° Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€.)

4. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² мСш, с подходящими Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½.

5. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ ΠΊ символам.

6. Π’Ρ‹Π΄Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы Π²Π½ΠΈΠ·.

7. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½ΠΈΠ· Π²Ρ‹Π΄Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… символов.

8. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ "cartouche" (ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ) Π²ΠΎΠΊΡ€ΡƒΠ³ тСкста.

9. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ пространство ΠΌΠ΅ΠΆΠ΄Ρƒ cartouche ΠΈ символами.

10.Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ subsurface.

11.Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ crease (складки) Π½Π° Ρ€Ρ‘Π±Ρ€Π°Ρ…, содСрТащихся Π² Π³Ρ€ΡƒΠΏΠΏΠ°Ρ… Π²Π΅Ρ€ΡˆΠΈΠ½ TextTop ΠΈ TextBottom.

Наш ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ скрипт слСдуСт Π·Π° этой схСмой ΠΏΠΎΡ‡Ρ‚ΠΈ Π² точности ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ инструмСнты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ Π² этой Π³Π»Π°Π²Π΅. ΠœΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ здСсь Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ сСкции (ΠΏΠΎΠ»Π½Ρ‹ΠΉ скрипт доступСн ΠΊΠ°ΠΊ engrave.py). ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с прСобразования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Text3d (c Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅) Π² список, содСрТащий список ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сСгмСнта ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π² тСкстС, ΠΈ ΠΌΡ‹ добавляСм Π½ΠΎΠ²Ρ‹ΠΉ пустой МСш-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² сцСну с нСсколькими пустыми Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½:

   vlist = curve2mesh(c)


   me = Blender.Mesh.New('Mesh')

   ob = Blender.Scene.GetCurrent().objects.new(me,'Mesh')


   me.addVertGroup('TextTop')

   me.addVertGroup('TextBottom')

   me.addVertGroup('Outline')

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

   loop=[]

   for v in vlist:

      offset=len(me.verts)

      me.verts.extend(v)

      edgeoffset=len(me.edges)

      me.edges.extend([(i+offset,i+offset+1) 

                        for i in range(len(v)-1)])

      me.edges.extend([(len(v)-1+offset,offset)])

      me.remDoubles(0.001)


      me.assignVertsToGroup('TextTop',

                            range(offset,len(me.verts)),

                            1.0,

                            Blender.Mesh.AssignModes.ADD)

      loop.append([me.edges[i] for i in range(edgeoffset,

                  len(me.edges) )])

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Ρ‘Π±Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ сохранили Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ части, ΠΌΡ‹ создаСм Π½ΠΎΠ²Ρ‹ΠΉ, ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ больший, Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Π²ΠΎΠΊΡ€ΡƒΠ³ Π½Π΅Π³ΠΎ ΠΈ добавляСм эти Π½ΠΎΠ²Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΈ Ρ€Ρ‘Π±Ρ€Π° ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΌΠ΅ΡˆΡƒ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π³Ρ€Π°Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ этими Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ, ΠΈ это дСйствиС начинаСтся Π½Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ строкС: здСсь ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠŸΠΈΡ‚ΠΎΠ½Π° zip(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ Ρ€Ρ‘Π±Π΅Ρ€ Π΄Π²ΡƒΡ… Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Ρ‘Π±Π΅Ρ€Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» упорядочСн Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (доступной Π² Tools.py), которая сортируСт Ρ€Ρ‘Π±Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π»Π΅ΠΆΠ°Π»ΠΈ Π² порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ соСдинСны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Ρ€Ρ‘Π±Π΅Ρ€ ΠΌΡ‹ создаСм Π΄Π²Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ индСксов Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ вычисляСм, какая ΠΈΠ· Π½ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΡΠΊΡ€ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Π³Ρ€Π°Π½ΡŒ. Π­Ρ‚ΠΎ вычислСниС производится посрСдством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ least_warped() (ΠΊΠΎΠ΄ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½), которая основана Π½Π° сравнСнии ΠΏΠ΅Ρ€ΠΈΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π³Ρ€Π°Π½Π΅ΠΉ, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… двумя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ порядками Π²Π΅Ρ€ΡˆΠΈΠ½. НСскручСнная Π³Ρ€Π°Π½ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ самый ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΏΠ΅Ρ€ΠΈΠΌΠ΅Ρ‚Ρ€, ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Ρ‘ ΠΌΡ‹ Π·Π°Ρ‚Π΅ΠΌ добавляСм ΠΊ ΠΌΠ΅ΡˆΡƒ.

   for l in range(len(loop)):

      points = expand.expand(me,loop[l],

                             0.02,loop[:l]+loop[l+1:])

      offset=len(me.verts)

      me.verts.extend(points)

      edgeoffset=len(me.edges)

      me.edges.extend([(i+offset,i+offset+1) 

                        for i in range(len(points)-1)])

      me.edges.extend([(len(points)-1+offset,offset)])

      eloop=[me.edges[i] for i in

range(edgeoffset,len(me.edges))]

      me.assignVertsToGroup('Outline',

                             range(offset,len(me.verts)),

                             1.0,

                             Blender.Mesh.AssignModes.ADD)

      faces=[]

      for e1,e2 in zip( expand.ordered_edgeloop(loop[l]),

                        expand.ordered_edgeloop(eloop)):

         f1=(e1.v1.index,e1.v2.index,

             e2.v2.index,e2.v1.index)