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

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

Автор Michel Anders

3. Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ мСш сущСства ΠΈΠ· ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.

4. Π’ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ мСш ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² сцСну.

ΠœΡ‹ ΠΏΡ€ΠΎΠΉΠ΄Ρ‘ΠΌ Ρ‡Π΅Ρ€Π΅Π· скрипт постСпСнно, показывая Π²Π°ΠΆΠ½Ρ‹Π΅ части Π² подробностях. (ΠŸΠΎΠ»Π½Ρ‹ΠΉ скрипт доступСн ΠΊΠ°ΠΊ creepycrawlies.py.) ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ созданиС частСй Ρ‚Π΅Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ для сборки вмСстС. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти части Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π΅, опрСдСляя подходящСС соСдинСниС ΠΈ отмСчая это соСдинСниС ΠΊΠ°ΠΊ Π³Ρ€ΡƒΠΏΠΏΡƒ Π²Π΅Ρ€ΡˆΠΈΠ½. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ экспортируСм эти мСши Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ΄Π° Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ скрипт, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ столкнёмся снова Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½.

БСйчас ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ этот сгСнСрированный ΠΊΠΎΠ΄ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ просто ΠΊΠ°ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, содСрТащий нСсколько списков Π²Π΅Ρ€ΡˆΠΈΠ½, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚Π΅Π»Π°. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ находится Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² ΠΏΡƒΡ‚ΠΈ поиска ΠŸΠΈΡ‚ΠΎΠ½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, .blender\scripts\bpymodules Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ, ΠΈΠ»ΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ скриптов. Π€Π°ΠΉΠ» Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ с ΠΌΠ΅ΡˆΠ΅Π²Ρ‹ΠΌΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ называСтся mymesh.py, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ пСрвая Ρ‡Π°ΡΡ‚ΡŒ нашСго ΠΊΠΎΠ΄Π° содСрТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ import:

import mymesh


Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса

ΠŸΡ€ΠΈ рисовании простого интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ использованиС Draw.Create() для создания Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΈ сборка ΠΈ инициализация этих ΠΊΠ½ΠΎΠΏΠΎΠΊ с Draw.PupBlock()

Π­Ρ‚ΠΎ нСсколько ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΠ΅Ρ€ΠΈΠ²ΡˆΠΈΠΌΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, доступными для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языков программирования, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ для использования. Основная идСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΎΠΊΠ½Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Π’ Ρ‚ΠΎ ΠΆΠ΅ самоС врСмя, ΠΎΠΊΠ½ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³Π°  Π·Π°Π΄Π°Ρ‘Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ. Π”ΠΈΠ°Π»ΠΎΠ³ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ мСню Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора. Π‘Π»Π΅Π½Π΄Π΅Ρ€ способСн Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½ΠΎ ΠΏΠΎΠΊΠ° ΠΌΡ‹ придСрТиваСмся основ.

Π₯отя Draw.Create() ΠΌΠΎΠΆΠ΅Ρ‚ воспроизвСсти ΠΊΠ½ΠΎΠΏΠΊΠΈ-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²Π²ΠΎΠ΄Π° строк, для нашСго прилоТСния Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²Π²ΠΎΠ΄Π° для Ρ†Π΅Π»Ρ‹Ρ… Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ ΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ. Π’ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΈΠ»ΠΈ Ρ†Π΅Π»ΠΎΠ΅), опрСдСляСтся Ρ‚ΠΈΠΏΠΎΠΌ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² Draw.Create(). Кнопка OK Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Draw.PupBlock(). Π­Ρ‚Π° функция Π±Π΅Ρ€Π΅Ρ‚ список ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ опрСдСляСт ΠΊΠ½ΠΎΠΏΠΊΡƒ для отобраТСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ состоит ΠΈΠ· тСкста, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ, созданного Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ  Draw.Create(), допустимых ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° ΠΈ максимума Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, ΠΈ тСкста подсказки (tooltip), ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ курсора Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ.

Draw = Blender.Draw

THORAXSEGMENTS = Draw.Create(3) # Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² торсС

TAILSEGMENTS = Draw.Create(5)   # Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² хвостС

LEGSEGMENTS = Draw.Create(2)    # Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² торса с

   # Π½ΠΎΠ³Π°ΠΌΠΈ

WINGSEGMENTS = Draw.Create(2)   # Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² торса с

                                # ΠΊΡ€Ρ‹Π»ΡŒΡΠΌΠΈ

EYESIZE = Draw.Create(1.0)      # Π Π°Π·ΠΌΠ΅Ρ€ Π³Π»Π°Π·

TAILTAPER = Draw.Create(0.9)    # ΠšΠΎΠ½ΡƒΡΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ

сСгмСнта хвоста

if not Draw.PupBlock('Add CreepyCrawly', [

('Thorax segments:' , THORAXSEGMENTS, 2, 50,

   'Number of thorax segments'),

('Tail segments:' , TAILSEGMENTS, 0, 50, 'Number of tail

segments'),

('Leg segments:' , LEGSEGMENTS, 2, 10, 

  'Number of thorax segments with legs'),

('Wing segments:' , WINGSEGMENTS, 0, 10, 

  'Number of thorax segments with wings'),

('Eye size:' , EYESIZE, 0.1,10, 'Size of the eyes'),

('Tail taper:' , TAILTAPER, 0.1,10, 

   'Taper fraction of each tail segment'),]):

   return

Как Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΌΡ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Π½Π°ΡˆΠΈΡ… ΠΊΠ½ΠΎΠΏΠΎΠΊ Π²Π²ΠΎΠ΄Π° Π² Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ 50 для сСгмСнтов торса ΠΈ хвоста), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ (ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹Π΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ систСму, Ссли ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ»ΠΈ процСссорная ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ скудны).


Π—Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€Π°

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ послСдниС настройки, ΠΊΠΎΠ³Π΄Π° скрипт Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ снова, Π½ΠΎ Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ скрипт запускаСтся ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ, ΠΈ вся информация Π²Π½ΡƒΡ‚Ρ€ΠΈ скрипта тСряСтся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² постоянном Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π‘ этой Ρ†Π΅Π»ΡŒΡŽ, API Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Registry (РССстра), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Π² памяти (Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° дискС), индСксируСмыС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

Наш ΠΊΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ GUI измСнится Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ своСй сути, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠΎΠ΄, ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠΉ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½Π½Ρ‹Π΅ значСния (Ссли ΠΎΠ½ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚), ΠΈ сопроводим ΠΊΠΎΠ΄, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ:

reg = Blender.Registry.GetKey('CreepyCrawlies',True)

try:

   nthorax=reg['ThoraxSegments']

except:

   nthorax=3

try:

   ntail=reg['TailSegments']

except:

   ntail=5

... <ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²> …

Draw = Blender.Draw

THORAXSEGMENTS = Draw.Create(nthorax)

TAILSEGMENTS = Draw.Create(ntail)

LEGSEGMENTS = Draw.Create(nleg)

WINGSEGMENTS = Draw.Create(nwing)

EYESIZE = Draw.Create(eye)

TAILTAPER = Draw.Create(taper)

if not Draw.PupBlock('Add CreepyCrawly', [\

... <ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅> …

return

reg={'ThoraxSegments':THORAXSEGMENTS.val,

     'TailSegments' :TAILSEGMENTS.val,

     'LegSegments' :LEGSEGMENTS.val,

     'WingSegments' :WINGSEGMENTS.val,

     'EyeSize' :EYESIZE.val,

     'TailTaper':TAILTAPER.val}

Blender.Registry.SetKey('CreepyCrawlies',reg,True)

ЀактичСскиС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись нашСго ΠΊΠ»ΡŽΡ‡Π° Π² рССстрС Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹. АргумСнт True (Π˜ΡΡ‚ΠΈΠ½Π°) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ наши Π΄Π°Π½Π½Ρ‹Π΅ с диска, Ссли ΠΎΠ½ΠΈ Π½Π΅ доступны Π² памяти, ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… Π½Π° диск Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ сохранСнии, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наш скрипт ΠΌΠΎΠ³ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ этой сохранСнной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π΄Π°ΠΆΠ΅ Ссли ΠΌΡ‹ останавливали Π‘Π»Π΅Π½Π΄Π΅Ρ€ ΠΈ пСрСзапустили Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅. ЀактичСски ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠ»ΠΈ записываСмый ΠΊΠ»ΡŽΡ‡ рССстра - это ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊ настоящСму Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠ»ΡŽΡ‡Π° рССстра ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Ρ‰Π΅ Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π² этом случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ None (Ничто) - ΠΎΠ± этой ситуации заботится ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ try … except … .


Вся ΠΌΠΎΡ‰ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π°

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

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ это построСниС ΠΈΠ· Π±Π»ΠΎΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ сообщСниС ΠΎΠ± ошибкС. Π­Ρ‚ΠΎ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ просто ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ сообщСниС Π½Π° Ρ‚Ρ€Π΅Π²ΠΎΠΆΠ½ΠΎΠΌ Ρ†Π²Π΅Ρ‚Π½ΠΎΠΌ Ρ„ΠΎΠ½Π΅, Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠ°ΠΊ дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, наТатия клавиш ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΌΡ‹ΡˆΠΈ) связаны с графичСскими элСмСнтами.

from Blender import Window,Draw,BGL

def event(evt, val):

    if evt == Draw.ESCKEY:

       Draw.Exit() # exit when user presses ESC

    return

def button_event(evt):

    if evt == 1:

       Draw.Exit()

    return

def msg(text):

    w = Draw.GetStringWidth(text)+20

    wb= Draw.GetStringWidth('Ok')+8

    BGL.glClearColor(0.6, 0.6, 0.6, 1.0)

    BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)

    BGL.glColor3f(0.75, 0.75, 0.75)

    BGL.glRecti(3,30,w+wb,3)

    Draw.Button("Ok",1,4,4,wb,28)

    Draw.Label(text,4+wb,4,w,28)

def error(text):

   Draw.Register(lambda:msg(text), event, button_event)

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ error() всС начинаСтся ΠΈ заканчиваСтся для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ; ΠΎΠ½Π° сообщаСт Π‘Π»Π΅Π½Π΄Π΅Ρ€Ρƒ Ρ‡Ρ‚ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΡƒΠ΄Π° ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ события, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ Ρ‰Π΅Π»Ρ‡ΠΊΠΈ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅, ΠΊΡƒΠ΄Π° ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π½Π°ΠΆΠ°Ρ‚ΡƒΡŽ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ, ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ взаимодСйствиС. Лямбда-функция Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΊΠ°ΠΊ функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² Draw.Register(), которая рисуСт, Π½ΠΎ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ text ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ error(). Ѐункция lambda ΠΏΠΎ сущСству опрСдСляСт Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π½ΠΎ с Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ тСкстом.

Ѐункция msg() ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° отрисовку всСх элСмСнтов Π½Π° экранС. Она рисуСт Ρ†Π²Π΅Ρ‚Π½ΠΎΠΉ Ρ„ΠΎΠ½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BGL.glRecti(), сообщСниС с тСкстом для отобраТСния (с Draw.Label()), ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ назначаСтся событиС Π½ΠΎΠΌΠ΅Ρ€ 1 (с Draw.Button()). Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ OK, этот Π½ΠΎΠΌΠ΅Ρ€ события посылаСтся Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий (event handler) - Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ button_event(), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π² Draw.Register(). ВсС, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий Π΄Π΅Π»Π°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ вызываСтся с этим Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ события 1 - Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Draw.Register() Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Draw.Exit(), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ наша функция error() ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ.