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

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

Автор Michel Anders

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π‘Π»Π΅Π½Π΄Π΅Ρ€ адаптируСтся ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π·Π°Π΄Π°Ρ‡Π°ΠΌ ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ создания 3D-Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π’Π°ΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ внСшниС Π΄Π°Π½Π½Ρ‹Π΅ (элСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ CSV) ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ создания ΠΈ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° прСдставлСнной Π² 3D гистограммы.



ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π‘Π»Π΅Π½Π΄Π΅Ρ€ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ Π΅ΠΌΡƒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ .csv Ρ„Π°ΠΉΠ», Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ сохраняСт это ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ это Π±Ρ‹Π»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ способ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π‘Π»Π΅Π½Π΄Π΅Ρ€ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. ΠœΡ‹ Π΄ΠΎΠΉΠ΄Ρ‘ΠΌ скоро Π΄ΠΎ этого скрипта, Π½ΠΎ сначала Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ запускал скрипт Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅:

blender -P /full/path/to/barchart.py

Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ вмСсто этого Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скрипт ΠΈΠ· тСкстового Π±ΡƒΡ„Π΅Ρ€Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ .blend Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ этого тСкстового Π±ΡƒΡ„Π΅Ρ€Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° порядок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² этому случаС - сначала ставится имя .blend Ρ„Π°ΠΉΠ»Π°:

blender barchart.blend -P barchart.py

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ описано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ API, Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

import sys

print sys.argv

ПослСдний Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. Наш скрипт Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для самого Π‘Π»Π΅Π½Π΄Π΅Ρ€Π° ΠΏΡ€ΠΈ использовании этого списка. Π›ΡŽΠ±Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для нашСго скрипта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ самим Π‘Π»Π΅Π½Π΄Π΅Ρ€ΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ находится послС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ½Ρ†Π°-ΠΎΠΏΡ†ΠΈΠΉ (end-of-options), Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ минуса (--).

НаконСц, ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π‘Π»Π΅Π½Π΄Π΅Ρ€ появлялся ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π» графичСский интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ВмСсто этого, ΠΌΡ‹ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ Π΅ΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ„ΠΎΠ½Π΅ ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ дСлаСтся посрСдством прохоТдСния ΠΎΠΏΡ†ΠΈΠΈ -b. Π—Π°Π΄Π°Π² всё это вмСстС, командная строка Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Π½Π° это:

blender -b barchart.blend -P barchart.py –- data.csv

Если Π‘Π»Π΅Π½Π΄Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ .blend Ρ„Π°ΠΉΠ», Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π‘Π»Π΅Π½Π΄Π΅Ρ€ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡΡ. Если ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ .blend Ρ„Π°ΠΉΠ», ΠΌΡ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ тСкст для нашСго скрипта Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅, ΠΈΠ½Π°Ρ‡Π΅ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π²Π° Ρ„Π°ΠΉΠ»Π° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ.


Π‘ΠΊΡ€ΠΈΠΏΡ‚ построСния гистограммы

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π²Π°ΠΆΠ½Ρ‹Π΅ части ΠΊΠΎΠ΄Π° кусками (ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» доступСн ΠΊΠ°ΠΊ barchart.blend, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ barchart.py ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ тСкст). ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠœΠΈΡ€Π° ΠΈ установки Ρ†Π²Π΅Ρ‚ΠΎΠ² Π΅Π³ΠΎ Π·Π΅Π½ΠΈΡ‚Π° ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π² Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π΅Π»Ρ‹ΠΉ (выдСлСнная Ρ‡Π°ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°):

if __name__ == '__main__':

    w=World.New('BarWorld')

    w.setHor([1,1,1])

    w.setZen([1,1,1])

Π—Π°Ρ‚Π΅ΠΌ, ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² Π‘Π»Π΅Π½Π΄Π΅Ρ€ ΠΈ провСряСм являСтся Π»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Ρ‚Π΅ΠΌ ΠΆΠ΅ самым .csv. Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π° ошибки:

csv = sys.argv[-1]

if csv.endswith('.csv'):

Если Ρƒ Π½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΌΡ‹ создаём Π½ΠΎΠ²ΡƒΡŽ Π‘Ρ†Π΅Π½Ρƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ BarScene ΠΈ присваиваСм Π΅Ρ‘ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ world ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ вновь созданному ΠΌΠΈΡ€Ρƒ (Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π²Π΄ΠΎΡ…Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТным сцСнариСм jessethemid Π½Π°   Blender   Artists http://blenderartists.org/forum/showthread.php?t=79285).   Π€ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ .blend Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ сцСна ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, просто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, ΠΌΡ‹ создаСм Π½ΠΎΠ²ΡƒΡŽ ΠΏΡƒΡΡ‚ΡƒΡŽ сцСну со Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ наши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹:

sc=Scene.New('BarScene')

sc.world=w

sc.makeCurrent()

Π—Π°Ρ‚Π΅ΠΌ, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ имя Ρ„Π°ΠΉΠ»Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая добавляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ barchart (гистограммы) Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сцСну ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ†Π΅Π½Ρ‚Ρ€ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наша функция addcamera() ΠΌΠΎΠ³Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ добавляСм Π»Π°ΠΌΠΏΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅Π½Π΄Π΅Ρ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ (Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС наш Ρ€Π΅Π½Π΄Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ вСсь Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ).

center = barchart(sys.argv[-1])

addcamera(center)

addlamp()

Π Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ самый простой (ΠΌΡ‹ столкнСмся с Π±ΠΎΠ»Π΅Π΅ слоТными ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π² Π“Π»Π°Π²Π΅ 8, Π Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ ΠΈ ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ). ΠœΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ контСкст Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π΄Ρ€Π°, ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. И, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹, ΠΌΡ‹ установим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° PNG ΠΈ запустим Ρ€Π΅Π½Π΄Π΅Ρ€.

context=sc.getRenderingContext()

context.setImageType(Scene.Render.PNG)

context.render()

НаконСц, ΠΌΡ‹ устанавливаСм Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² ΠΏΡƒΡΡ‚ΡƒΡŽ строку, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наш Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Π±Ρ‹Π»ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Π‘Π»Π΅Π½Π΄Π΅Ρ€) ΠΈ сохраняСм нашС Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ имя, ΠΊΠ°ΠΊ Ρƒ .csv-Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ приняли ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .png. ΠœΡ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ имя Ρ„Π°ΠΉΠ»Π° заканчиваСтся Π½Π° .csv, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ бСзопасно Ρ‚ΡƒΠΏΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ послСдниС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ символа ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ .png

context.setRenderPath('')

context.saveRenderedImage(csv[:-4]+'.png')

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π»Π°ΠΌΠΏΡ‹ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ отличаСтся ΠΎΡ‚ добавлСния любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ "hello world". ΠœΡ‹ создаём Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Lamp, добавляСм Π΅Π³ΠΎ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ сцСнС ΠΈ устанавливаСм Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Lamp ΠΈΠΌΠ΅Π΅Ρ‚, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠ½ΠΎΠ³ΠΎ настраиваСмых ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½ΠΎ ΠΌΡ‹ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΡƒΠ΅ΠΌΡΡ Π½Π΅-Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ Π»Π°ΠΌΠΏΠΎΠΉ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΡƒΡŽ ΠΈΠ΄ΠΈΠΎΠΌΡƒ ΠŸΠΈΡ‚ΠΎΠ½Π°: loc - ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π²Π΅Π»ΠΈΡ‡ΠΈΠ½, Π½ΠΎ setLocation() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ€Π°ΡΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ * Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ:

def addlamp(loc=(0.0,0.0,10.0)):

    sc = Scene.GetCurrent()

    la = Lamp.New('Lamp')

    ob = sc.objects.new(la)

    ob.setLocation(*loc)

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ слоТнСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‘ Π½Π° Π½Π°ΡˆΡƒ гистограмму ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ» ΠΎΠ±Π·ΠΎΡ€Π° достаточно ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π²ΠΈΠ΄Π΅Ρ‚ΡŒ. ΠœΡ‹ опрСдСляСм здСсь ΠΏΠ΅Ρ€ΡΠΏΠ΅ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ ΠΈ устанавливаСм довольно ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ ΡƒΠ³ΠΎΠ». ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΌΠ΅Ρ€Π° ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΠΆΠ΅ сориСнтирована вдоль оси z, ΠΌΡ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ вращСния, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ установим ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² 12 Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΎΡ‚ Ρ†Π΅Π½Ρ‚Ρ€Π° вдоль оси z, ΠΊΠ°ΠΊ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ снизу строкС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°:

def addcamera(center):

    sc = Scene.GetCurrent()

    ca = Camera.New('persp','Camera')

    ca.angle=75.0

    ob = sc.objects.new(ca)

    ob.setLocation(center[0],center[1],center[2]+12.0)

    sc.objects.camera=ob

Π‘Π°ΠΌΠ° функция barchart Π½Π΅ такая ΡƒΠΆ большая Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΡΡ‚ΡŒ. ΠœΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» с ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ стандартный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ csv ΠΈΠ· ΠŸΠΈΡ‚ΠΎΠ½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°. ΠœΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ всС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ столбцов Π² xlabel, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² rows (строки).

from csv import DictReader

def barchart(filename):

    csv = open(filename)

    data = DictReader(csv)

    xlabel = data.fieldnames[0]

    rows = [d for d in data]

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

maximum = max([float(r[n]) for n in data.fieldnames[1:] 

               for r in rows])

minimum = min([float(r[n]) for n in data.fieldnames[1:] 

               for r in rows])

Π§Ρ‚ΠΎΠ±Ρ‹ фактичСски ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ столбики, ΠΌΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ всСм строкам. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ x ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ тСкстовой ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ (ΠΊΠ°ΠΊ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ мСсяца, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€), ΠΌΡ‹ сохраняСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ столбики. Π‘Π°ΠΌΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ x добавляСтся ΠΊ сцСнС Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Text3d Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ label(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ значСния y Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ соотвСтствСнно ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ  Cube (ΠšΡƒΠ±), добавляСмыми Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ bar(). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ label() ΠΈ bar() Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ здСсь.

for x,row in enumerate(rows):

    lastx=x

    label(row[xlabel],(x,10,0))

    for y,ylabel in enumerate(data.fieldnames[1:]):

        bar(10.0*(float(row[ylabel])-minimum)/maximum,

(x,0,y+1))

x = lastx+1

НаконСц, ΠΌΡ‹ подписываСм ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…) своим собствСнным Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ столбца ΠΊΠ°ΠΊ label. ΠœΡ‹ сохранили число Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ x, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€ нашСй гистограммы дСля Π΅Π³ΠΎ Π½Π° Π΄Π²Π° (y-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ установлСн Π½Π° 5.0, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ всС значСния ΠΏΠΎ y, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π»Π΅ΠΆΠ°Π»ΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ 0 Π΄ΠΎ 10).

for y,ylabel in enumerate(data.fieldnames[1:]):

    label(ylabel,(x,0,y+0.5),'x')

return (lastx/2.0,5.0,0.0)