<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2339343325189154359</id><updated>2024-09-01T12:52:04.490-07:00</updated><title type='text'>Записки о змеи в Blender&#39;е</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-7289332339838606019</id><published>2010-06-11T15:55:00.000-07:00</published><updated>2010-06-11T15:59:35.071-07:00</updated><title type='text'>автоматическое обновление картинок в сете</title><content type='html'>&lt;meta equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;&lt;meta name=&quot;ProgId&quot; content=&quot;Word.Document&quot;&gt;&lt;meta name=&quot;Generator&quot; content=&quot;Microsoft Word 11&quot;&gt;&lt;meta name=&quot;Originator&quot; content=&quot;Microsoft Word 11&quot;&gt;&lt;link rel=&quot;File-List&quot; href=&quot;file:///C:%5CDOCUME%7E1%5C0376%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml&quot;&gt;&lt;o:smarttagtype namespaceuri=&quot;urn:schemas-microsoft-com:office:smarttags&quot; name=&quot;State&quot;&gt;&lt;/o:smarttagtype&gt;&lt;o:smarttagtype namespaceuri=&quot;urn:schemas-microsoft-com:office:smarttags&quot; name=&quot;place&quot;&gt;&lt;/o:smarttagtype&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate=&quot;false&quot; latentstylecount=&quot;156&quot;&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if !mso]&gt;&lt;object classid=&quot;clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D&quot; id=&quot;ieooui&quot;&gt;&lt;/object&gt; &lt;style&gt; st1\:*{behavior:url(#ieooui) } &lt;/style&gt; &lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:Wingdings; 	panose-1:5 0 0 0 0 0 0 0 0 0; 	mso-font-charset:2; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:0 268435456 0 0 -2147483648 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:&quot;&quot;; 	margin:0cm; 	margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:12.0pt; 	font-family:&quot;Times New Roman&quot;; 	mso-fareast-font-family:&quot;Times New Roman&quot;;} @page Section1 	{size:595.45pt 841.7pt; 	margin:42.55pt 42.5pt 42.55pt 42.55pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;}  /* List Definitions */  @list l0 	{mso-list-id:729155665; 	mso-list-type:hybrid; 	mso-list-template-ids:-1663770152 68747265 68747267 68747269 68747265 68747267 68747269 68747265 68747267 68747269;} @list l0:level1 	{mso-level-number-format:bullet; 	mso-level-text:; 	mso-level-tab-stop:61.65pt; 	mso-level-number-position:left; 	margin-left:61.65pt; 	text-indent:-18.0pt; 	font-family:Symbol;} ol 	{margin-bottom:0cm;} ul 	{margin-bottom:0cm;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Обычная таблица&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:&quot;Times New Roman&quot;; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Очень много времени уходит на создание модели, работы над ее реализацией, подгонке текстур и прочего, что порою совсем не остается времени и сил на то, чтобы как-то опубликовать свои творения.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Рисовать «в стол», вернее сказать, на жесткий диск – занятие интересное на первых порах знакомства с редактором, но когда уже что-то начало получаться, хочется рассказать всему миру о своих творениях. Желание, конечно, похвальное, но в условиях повального цейтнота, на то, чтобы заняться популяризацией своего творчества, просто не хватает времени.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Раз у самого нет времени, то надо это дело кому-нибудь перепоручить – завести секретаршу. Расходно и не по-программерски, у нас же есть компьютер и интернет. Вот пусть компьютер сам и выкладывает наши картинки – чего ему зря пыль собирать и электричество кушать.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Где размещать наши творения? На многочисленных форумах и сайтах, посвященных 3D моделированию, конечно, надо бы, но это тоже отнимает время и накладывает некоторые обязательства. Мы же с Вами – художники свободные и больше всего ценим, свободу и независимость во всем, что касается жизни.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Лично я использую сервис от Google’а, и ничего в нем плохого не вижу. За любовь, как говорят, не платят, а свобода – в нутрии нас, внешней свободы, живя в обществе не добиться, как бы сильно этого не стараться. Мы же люди активные и контакты с обществом – неотъемлемая часть нашей жизни, без людей мы просто задыхаемся. И ради свободы мы не за что на свете не поедем на необитаемый остров. Вот такая вот математика – хотим свободы, но изолироваться не желаем – ищем компромиссы.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Но переходим к сути поста, у нас имеются творения, которые должны быть загружены на сервис Picasa. Что для этого нужно? Руки, чтобы били не до конца кривые и росли, желательно все же оттуда, откуда должны они и расти – этого, принципе достаточно, еще должен быть действующий аккаунт на Picasa, пароль от этой учетки, самом Python’е должна быть установлена библиотека от Google – но это все лирики и не столь важно. Главное – идея.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Идея проста – мы авторизируемся на сервисе, создаем новый альбом, в который выгружаем наши работы. Естественно все это мы делаем не через браузер, а перепоручаем работу змею.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Итак, наш скрипт состоит из трех частей:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-left: 61.65pt; text-align: justify; text-indent: -18pt;&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=&quot;font-family: Symbol;&quot;&gt;&lt;span style=&quot;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Авторизироваться на сервисе;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-left: 61.65pt; text-align: justify; text-indent: -18pt;&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=&quot;font-family: Symbol;&quot;&gt;&lt;span style=&quot;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Создание нового альбома&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-left: 61.65pt; text-align: justify; text-indent: -18pt;&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=&quot;font-family: Symbol;&quot;&gt;&lt;span style=&quot;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Добавить фотографий (в данном случае – одной фотографии, что сути не меняет) в созданный альбом&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Чтобы авторизироваться на сервисе, вводим переменные MyLog, password, которые понятно что, будут содержать.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Теперь сразу же переходим к написанию скрипта – а чего медлить-то.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;import gdata.photos.service&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;import gdata.media&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;import gdata.geo&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Следующей строчкой мы определим наши переменные, необходимые для аутификации.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;MyLog = ‘ArkSmoke’&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;password = ‘pass’&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;теперь создаем клиент для работы сервисом&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;gd_client = gdata.photos.service.PhotosService()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Дальше выполняем процедуру аутификации&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;gd_client.email = MyLog # Set your Picasaweb e-mail address...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;gd_client.password = password&lt;span style=&quot;&quot;&gt;  &lt;/span&gt;# ... and password&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;gd_client.source = &#39;api-sample-google-com&#39;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;gd_client.ProgrammaticLogin()&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Все, теперь мы полноправные авторизированные хозяева на сервисе – можем создвать свой собственный альбом – чем мы без промедления и займемся.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;album = gd_client.InsertAlbum(title =&#39;Album for try&#39;, summary = &#39;this album for blogs&#39;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Всего одна строчка и альбом готов. Тут все прозрачно – мы указываем два параментра: название альбома и краткое к нему пояснение. Переменная &lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;album&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;&lt;/i&gt;превратилась в объект, со всеми свойствами и атрибутами объекта. В данном примере нам будет интересен лишь одни параетр – порядковый номер, созданного альбома – &lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;album&lt;/span&gt;.&lt;/i&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;gphotot&lt;/span&gt;_&lt;/i&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;id&lt;/span&gt;.&lt;/i&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;text&lt;/span&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;С добавлением фотографий дело обстоит немного сложнее: нам надо прописать расположение фотографии на носителе информации, с которого мы будем ее добавлять и альбома, в который мы будем эту фотку добавлять – вывод вводим еще две переменные: для расположения альбома, и фотографии.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;album_url = &#39;/data/feed/api/user/%s/albumid/%s&#39; % (&#39;&lt;st1:state st=&quot;on&quot;&gt;&lt;st1:place st=&quot;on&quot;&gt;Ark&lt;/st1:place&gt;&lt;/st1:state&gt;&#39;, album.gphotot_id.text)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;filename = &#39;dsb.jpg&#39;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;В адрес альбомы мы подставляем Ваш никнайм на сервисе и номер альбома (в дано случае только что созданного.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Теперь создаем обект для работы с фотогрфиями – мы просо добавим новую и все.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;i style=&quot;&quot;&gt;&lt;span style=&quot;&quot; lang=&quot;EN-US&quot;&gt;photo = gd_client.InsertPhotoSimple(album_url, &#39;fistTry&#39;, &#39;Uploaded using the API&#39;, filename, content_type=&#39;image/jpeg&#39;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify; text-indent: 25.65pt;&quot;&gt;Собственно говоря, пока все. Теперь мы можем добавлять свои творения в автоматическом режиме.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/7289332339838606019/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2010/06/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/7289332339838606019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/7289332339838606019'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2010/06/blog-post.html' title='автоматическое обновление картинок в сете'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-5766016641050955022</id><published>2010-02-25T13:29:00.001-08:00</published><updated>2010-02-25T13:29:39.541-08:00</updated><title type='text'>Ко дню защитника о защите.</title><content type='html'>&lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;Хоть праздник и прошел, но самое время поговорить об защите в &lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;Blender&lt;/span&gt;, вообще этот разговор я заводить не хотел, но наткнулся на статью, и не отреагировать не смог.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;Дело в том, что за простоту и мощность &lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;Blender&lt;/span&gt;’а как студии программирования приходится платить некой уязвимостью. Я говорю о том факте, что в &lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;Blender&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;есть возможность автоматически запускать скрипты при открытии файла. Чем это грозит? А грозит это тем, что во время старта файла с расширением .&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;blend&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;можно запустить любой исполняемый файл. Я Вас не призываю этого делать и не несу никакой ответственности за Ваши действия, но призываю быть осторожнее при открытии файлов от неизвестного автора.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;Как работает этот механизм? Пишем простенький скрипт, например такой:&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;import os&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;os.system(&#39;calc.exe&#39;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;Дальше переходим в &lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;Buttons&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;Window&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; &lt;/span&gt;переходим в &lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;Script&lt;/span&gt;. Там нажимаем кнопку &lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;New&lt;/span&gt;, выбираем имя нашего скрипта, указываем событие, при котором, скрипт срабатывает. Я указал &lt;span lang=&quot;EN-US&quot; style=&quot;mso-ansi-language:EN-US&quot;&gt;OnLoad&lt;/span&gt; – при загрузке. Теперь сохраяню файл. Отрываю его – скрипт срабатывает – я могу пользоваться калькулятором! Иногда очень полезно.&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align:justify;text-indent:28.5pt&quot;&gt;И помните, что эта особенность не баг, а фича, так что будьте внимательны и осмотрительны. Никакая программная защита не спасет, если нет головы. Удачи. Защищайте себя сами – угроза можете придти с любой стороны, будьте готовы.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/5766016641050955022/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2010/02/blog-post_25.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/5766016641050955022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/5766016641050955022'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2010/02/blog-post_25.html' title='Ко дню защитника о защите.'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-8205494824947513488</id><published>2010-02-21T06:22:00.000-08:00</published><updated>2010-02-21T06:39:21.965-08:00</updated><title type='text'>Управление Камерой</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;line-height:115%; Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;С того времени, когда я начал рассматривать &lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%;Times New Roman&amp;quot;; mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Blender&lt;/span&gt;&lt;span style=&quot; line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt; не как мощный инструмент 3&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%;Times New Roman&amp;quot;; mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;line-height: 115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt; моделирования, а как среду программирования, меня интересовал вопрос управления в виртуальном мире.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;line-height:115%; Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;В предыдущих постах я показывал, как решать совершенно не стандартные для &lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot; line-height:115%;Times New Roman&amp;quot;;mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Blender&lt;/span&gt;&lt;span style=&quot;line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt; задачи.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;line-height:115%; Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Итак, хоть я скрытый злодей, помышляющий о том, как завоевать вселенную, она мне не нужна, как и власть и деньги, хотя без денег на «железо» и интернет не обойтись, мной больше двигают исследовательские цели. Ну, скажите, какой смысл от мира, если его нельзя пощупать и поизучать? На мой взгляд – никакого. Поэтому, создав виртуальный мир, мне стало интересно, а как же все-таки в него пустить меня, исследователя?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;line-height:115%; Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Решение простое и одно – надо писать скрипт и запустить его в &lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height: 115%;Times New Roman&amp;quot;;mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Blendr&lt;/span&gt;&lt;span style=&quot;line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;. Скрипт управления камерой. Возиться самому мне в ту пору, естественно, не хотелось. Я только представил все эти аффинные преобразования да еще в трех мерном мире, мне сразу плохо стало. Другой математической модели управления камерой тогда я не видел. И перспектива возиться с матрицами меня, прямо скажу, очень сильно, тогда еще студента, угнетала. Но ведь к тому времени на &lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%;Times New Roman&amp;quot;; mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Blender&lt;/span&gt;&lt;span style=&quot; line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt; уже писались игры, а, значит, управление камерой было реализовано. Значит, задача сводится к нахождению удовлетворительного и, по возможности, универсального скрипта управления камерой. Несколько вариантов с преобразованиями матриц я отмел, как меня не устраивающие, и стал искать дальше.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;line-height:115%; Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Все же странно устроен человек, не представляя, как это можно сделать иначе, отметает варианты и ищет, уж поистине то, не знаю что. Но, самое интересное, в людском мире то, что это «не знаю что» находится. Удовлетворивший меня скрипт находится на &lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%;Times New Roman&amp;quot;; mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;a href=&quot;http://www.tutorialforblender3d.com/&quot;&gt;www&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;a href=&quot;http://www.tutorialforblender3d.com/&quot;&gt;.&lt;/a&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%;Times New Roman&amp;quot;;mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;a href=&quot;http://www.tutorialforblender3d.com/&quot;&gt;tutorialforblender&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;a href=&quot;http://www.tutorialforblender3d.com/&quot;&gt;3&lt;/a&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%;Times New Roman&amp;quot;; mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;a href=&quot;http://www.tutorialforblender3d.com/&quot;&gt;D&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;line-height: 115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;a href=&quot;http://www.tutorialforblender3d.com/&quot;&gt;.&lt;/a&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%;Times New Roman&amp;quot;;mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;a href=&quot;http://www.tutorialforblender3d.com/&quot;&gt;com&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;, но так же файл с этим же скриптом я выкладываю &lt;a href=&quot;http://narod.ru/disk/18123733000/MouseLook.py.html&quot;&gt;здесь&lt;/a&gt;. В тексте ничего не меняю, считаю, что не имею на это право. А вот здесь объясню механизм его работы.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;line-height:115%; Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Считается одной из самых сложных задач по обучению программирования – перевод текста программы на человеческий язык, то есть словами объяснить алгоритм работы Вашей программы. Лично я не люблю взять готовый скрипт и использовать его, не разобравшись в механизмах его работы, если, что-то не понял, то изучаю этот скрипт до дыр. Но для того, чтобы понять работу скрипта управления логикой, нужно понимать логику управления логическими блоками (считайте это каламбуром, а не тавтологией). Про работу логических блоков я объяснять не стану (в обозримом будущем выйдет моя статья по созданию игр в &lt;/span&gt;&lt;span lang=&quot;EN-US&quot;   style=&quot;line-height:115%; Times New Roman&amp;quot;;mso-ansi-language:EN-USfont-family:&amp;quot;;font-size:12.0pt;&quot;&gt;Blender&lt;/span&gt;&lt;span style=&quot;line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;, а повторяться, я не люблю – если возникнет необходимость что-то уточнить, можно задать вопрос и посмотреть на демонстративный &lt;a href=&quot;http://narod.ru/disk/18123732000/MouseLook.blend.html&quot;&gt;файл&lt;/a&gt;).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;line-height:115%;Times New Roman&amp;quot;font-family:&amp;quot;;font-size:12.0pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEiHtQDDqsvgEfEPX1oRTCRjTzFtXW6fg6cUbXCNwirupwXZD79mtR9Xm30n7QL1kf_rvif2sFpWzWqOSjlCiwVfNV0B0FLwTU0jOBPk1aLgD02LFpmtrlcExG_ffCUVmX0OzCp3heWAU/s1600-h/ML01.PNG&quot;&gt;&lt;img style=&quot;text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 320px; height: 250px; &quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEiHtQDDqsvgEfEPX1oRTCRjTzFtXW6fg6cUbXCNwirupwXZD79mtR9Xm30n7QL1kf_rvif2sFpWzWqOSjlCiwVfNV0B0FLwTU0jOBPk1aLgD02LFpmtrlcExG_ffCUVmX0OzCp3heWAU/s320/ML01.PNG&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5440705090530807282&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%; font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;На рисунке продемонстрированы все необходимые настройки логических блоков:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%; font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;Сенсер одни – &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;Mouse&lt;/span&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;, он настроен на событие &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;Movement&lt;/span&gt;&lt;span style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;, контроллер тоже одни, в нем находится наш скрипт, управления камерой. А вот актуаторов – 2: одни, LookLeftRight, отвечает за движения камеры по горизонтали, второй, LookUpDown, - по вертикали.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%; font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;Условно я делю скрипт на две части: &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;get&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: 12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;и &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt; части. В первой части мы объясняем скрипку откуда он берет исходные данные и что с ними делает, во второй части присваиваем полученные результаты – все как всегда просто:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;импортируем библиотеку&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;t Rasterizer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;import Rasterizer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# для удобства чтения скрипта вводим переменную, которой присваиваем текущий&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# контроллер&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;controller&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt; = &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;GameLogic&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;.&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;getCurrentController&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# назначаем переменную, к которой этот скрипт присоединяем&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;player = controller.getOwner()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# присваиваем переменной сенсор с именем &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;Mouse&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;#здесь имеется ввиду то имя, которым Вы назвали сенсор в логических блоках&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;mouse = controller.getSensor(&quot;Mouse&quot;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;   &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# вводим переменные, которым присваиваем наши актуаторы&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;lookLeftRight = controller.getActuator(&quot;LookLeftRight&quot;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;lookUpDown = controller.getActuator(&quot;LookUpDown&quot;)&lt;span style=&quot;mso-spacerun:yes&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: normal; &quot;&gt;В этом мы связали входящие данные и выходящие, на мой взгляд, именно эта связь является самой трудной для понимания: тут происходит основная связь скрипта с логикой самого файла – если скрипт универсальный, то файл надо подстраивать под этот скрипт, вот для это на и назначаются все переменные, но идем дальше.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# назначаем переменным ширину и высоту экрана, это надо для перемещения&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;width = Rasterizer.getWindowWidth()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;height = Rasterizer.getWindowHeight()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;     &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;определяем&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt; mouse movement&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt; функцию&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;def mouseMove():&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;    &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# определяем расстояние, пройденное от центра экрана &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;x = width/2 - mouse.getXPosition() &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;y = height/2 - mouse.getYPosition()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# инициализируем &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;mouse&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt; &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;если еще не сделали этого&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;if hasattr(player, &#39;mouseInit&#39;) == False:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:2&quot;&gt;              &lt;/span&gt;x = 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:2&quot;&gt;              &lt;/span&gt;y = 0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:2&quot;&gt;              &lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# тут баг&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;span style=&quot;mso-tab-count:2&quot;&gt;              &lt;/span&gt;# и вместо &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;True&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;. надоиспользовать&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt; 1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:2&quot;&gt;              &lt;/span&gt;player.mouseInit = 1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;   &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;возвращаем передвижение мыши&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;return (x, y)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# присваиваем mouse значения, полученные функцией, их два &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family: &amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;X&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;,&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;Y&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;move = mouseMove()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;задаем чувствительность&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;sensitivity = 0.001&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# Суммируем направление и чувствительность&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;#на самом деле умножаем, но оставил термин из комментария к скрипту&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;move&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;[0] – это перемещение мыши по &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;X&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;move&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;[1] – это перемещение мыши по &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt;Y&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;leftRight = move[0] * sensitivity&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;upDown = move[1] * sensitivity&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;устанавливаем, полученные значения в актуаторы&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;lookLeftRight.setDRot( 0.0, 0.0, leftRight, False)&lt;span style=&quot;mso-spacerun:yes&quot;&gt;   &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;lookUpDown.setDRot( upDown, 0.0, 0.0, True)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;# используем, уже полученные актуаторы в нашем файле&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;GameLogic.addActiveActuator(lookLeftRight, True)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;GameLogic.addActiveActuator(lookUpDown, True)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;; mso-ansi-language:EN-US&quot;&gt;# &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;размещаем&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;font-size:12.0pt; line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;;mso-ansi-language:EN-US&quot;&gt; mouse &lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height: 115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;в центре экрана&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: normal; &quot;&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: normal; &quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;Rasterizer.setMousePosition(width/2, height/2)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%; font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;Вот и все – скрипт работает, можете проверять.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%; font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;Это один из лучших скриптов для управления камерой при создании игр, у меня он лежит в качестве боевого скрипта.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-bottom:0cm;margin-bottom:.0001pt;text-align: justify;text-indent:1.0cm&quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: normal; &quot;&gt;&lt;i style=&quot;mso-bidi-font-style:normal&quot;&gt;&lt;span style=&quot;font-size:12.0pt;line-height:115%;font-family:&amp;quot;Times New Roman&amp;quot;&quot;&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: normal; &quot;&gt;Желаю Вам успехов.&lt;/span&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/8205494824947513488/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2010/02/blog-post_21.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/8205494824947513488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/8205494824947513488'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2010/02/blog-post_21.html' title='Управление Камерой'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEiHtQDDqsvgEfEPX1oRTCRjTzFtXW6fg6cUbXCNwirupwXZD79mtR9Xm30n7QL1kf_rvif2sFpWzWqOSjlCiwVfNV0B0FLwTU0jOBPk1aLgD02LFpmtrlcExG_ffCUVmX0OzCp3heWAU/s72-c/ML01.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-2220263357240422885</id><published>2010-02-06T13:55:00.000-08:00</published><updated>2010-02-06T14:03:29.579-08:00</updated><title type='text'>О начале года</title><content type='html'>Год начался с некоторых изменений в жизни. Как всегда всякие изменения приводят к тому, что нужно подвести анализ сделанной работы. С чего, собственно говоря, я и начинаю второй месяц года. Из-за занятости на основной работе и небольшого смещения интересов (цикл статей, посвященных Blender я завершил еще в 2009 году, хотя до сих пор они не все опубликованы), но так же, чтобы было удобнее работать с материалом, который я уже здесь приводил, выкладываю файлы скриптов, использованных мною в качестве примеров.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Скачать архив со скриптами можно &lt;a href=&quot;http://narod.ru/disk/17653576000/%D1%81%D0%BA%D1%80%D0%BF%D0%B8%D0%BF%D1%82%D1%8B.zip.html&quot;&gt;здесь&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Сам же я на время сменю направленность блога (надеюсь, что это изменение станет более информативно) и некоторое время буду наполнять содержимое своего блога переводами англоязычных статей (с личными комментариями к коду), иногда будет полезно выкладывать статьи из API в переводе и объяснением, как это работает.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Надеюсь на понимание.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/2220263357240422885/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2010/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/2220263357240422885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/2220263357240422885'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2010/02/blog-post.html' title='О начале года'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-5913434133423407209</id><published>2010-01-09T17:44:00.001-08:00</published><updated>2010-01-09T17:47:45.750-08:00</updated><title type='text'>Создаем аудиобазу иностранных слов</title><content type='html'>Начался новый год, завершаются праздники и каникулы, скоро предстоят рабочие будни. Хотя у кого-то они уже начались: сессия, консультации, экзамены. Не знаю, как Вы, а я с нового года решил подтянуть свой английский язык и в очередной раз взяться за изучение японского. Слово дал, но вот что с ним делать? Надо же когда-то браться за свое образование, вот я и решил отгулять праздники, подумать и собраться.&lt;br /&gt;Собрался, но подошел в этом плане по-программерски, чтобы было интересно и полезно ни только мне. Вообще, при изучении иностранного языка самое сложное – произношение (как я с ним намучался, и сколько мучений еще предстоит), но суть не в том, а в том, чтобы всегда под рукой иметь некий аудиофайл, чтобы сверить сове произношение, ну или, как в случае с английским языком, понять, как данное слов читается. Вот попробуйте с ходу прочитать pronunciation. У меня, когда я этот ужас увидел в первый раз, не получилось его прочитать, а очень бы хотелось.&lt;br /&gt;Попробуем собрать собственную аудиобазу изучаемых слов – лингво нам не подходит – слишком громоздкий, да и не бесплатный, а мы Фаны свободного программного обеспеченья. Что же делать – лазить по Интернету и искать подходящий словарь с аудибзой не хочется – время дорого. Ключевое слово – искать. Кто у нас все знает? – Google. Да в добавок еще и сервисы свои бесплатно предоставляет. Вот и воспользуемся одним из его серверов - &lt;a href=&quot;http://translate.google.com&quot;&gt;http://translate.google.com&lt;/a&gt;. Если не использовали этот он-лайн переводчик – обязательно попробуйте, но о его методах перевода – если время будет, поговорим отдельно.&lt;br /&gt;Сильно не ругайтесь, что отошел от темы Python в Blender. Просто я все еще работаю с Blender, как средой программирования. Но вернемся к базе адиофайлов. Переводчик, предлагаемый Google’ом, может произносить слова – здорово этим и воспользуемся. Заставим диктора произнести наше pronunciation. Заставили – послушали, а дальше-то что? Надо понять, откуда диктор его читает. Запускаем сниффер и перехватываем вот такой адрес – URL = &lt;a href=&quot;http://translate.google.com/translate_tts?q=pronunciation&amp;tl=en&quot;&gt;http://translate.google.com/translate_tts?q=pronunciation&amp;tl=en&lt;/a&gt;. Принцип работы ясен: на url-адрес http://translate.google.com/translate_tts - передаем два параметра: q – что будем произносить, tl – язык, а результатом этого запроса будет нужный нам аудиофайл – не верите, скопируйте адрес в броузер, загрузите файл, допишите ему расширение .mp3 и прослушайте.&lt;br /&gt;Алгоритм добывания слов ясен, как добыть слово руками – понятно, теперь автоматизируем это добывание, с помощью Python.&lt;br /&gt;&lt;br /&gt;У нас будет процедура speach с двумя параметрами: язык и слово. Слово будет так же и именем аудифайла, чтобы знать, какое слово, где лежит. Формируем запрос, отправляем запрос, получаем результат, сохраняем результат – вот и все.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;import sys&lt;br /&gt;import urllib2&lt;br /&gt;import urllib&lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;autor : ArkSmoke&lt;br /&gt;url   : http://arkpython.blogspot.com&lt;br /&gt;&lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;&lt;br /&gt;def speach(tl, text):&lt;br /&gt;    opener = urllib2.build_opener()&lt;br /&gt;    opener.addheaders = [(&#39;User-agent&#39;, &#39;My&#39;)]&lt;br /&gt;&lt;br /&gt;    live_word = opener.open(&lt;br /&gt;        &quot;http://translate.google.com/translate_tts?&quot; +&lt;br /&gt;        urllib.urlencode({&#39;tl&#39;: tl}),&lt;br /&gt;        data = urllib.urlencode({&#39;tl&#39;: tl,&lt;br /&gt;                               &#39;q&#39;: text})&lt;br /&gt;    )&lt;br /&gt;&lt;br /&gt;    snd = live_word.read()&lt;br /&gt;    open(text +&#39;.mp3&#39;,&#39;wb&#39;).write(snd)&lt;br /&gt;    &lt;br /&gt;speach(&#39;en&#39;, &#39;Yes&#39;)&lt;br /&gt;print &#39;done&#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;По большому счету в данном скрипте и комментировать нечего – все словами описано выше. Удачи Вам. И приятного изучения языка.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/5913434133423407209/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2010/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/5913434133423407209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/5913434133423407209'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2010/01/blog-post.html' title='Создаем аудиобазу иностранных слов'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-5780639729769472975</id><published>2009-12-27T12:17:00.000-08:00</published><updated>2009-12-27T12:26:23.992-08:00</updated><title type='text'>Снова хулиганим</title><content type='html'>Новый год уже на носу. С каким бы настроением мы не подходили к его финалу, все равно хочется похулиганить, внести некоторое разнообразие в серые одинаковые будни.&lt;br /&gt;Пускай, я снова ухожу от основной темы, не пишу сткрипт генерации какой нибудь поздравительной открытки, а собственно говоря, почему бы нет. Только представьте: нажимаешь run и вот оно – новогодние чудо – поздравление с новым годом. Интересная затея? Мне нравится. Но подходить мы к теме будем творчески. Стопудово Вас друг когда-нибудь да просил подарим ему какую-нибудь из Ваших сцен, выполненных в Blender. И вот, наконец, Вы решились это сделать, но просто файл дарить скучно.&lt;br /&gt;Подарим – скрипт. Да один лишь скрипт, который нужно запускать.&lt;br /&gt;Посмотрим, как это организовать, а, заодно и убедимся, что ничего нет не возможного.&lt;br /&gt;Нам понадобятся два скрипта. Один, чтобы упаковать Вашу сцену в txt-файл (да я не оговорился – именно, в блокнот :р). и скрипт, который Вы подарите другу, который уже будет в себе содержать Вашу сцену. По шпионски звучит? Да мне нравятся такие заморочки. На деле это все выглядит очень просто – у меня в папке есть файл 01.blend, именно его я и собираюсь подарить другу. Весит он 1,59 МБ (приношу прощение за сленг, но уже привык так говорить). В этой папке я создаю файл inbox.py с кодом.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;import StringIO&lt;br /&gt;import gzip&lt;br /&gt;import base64&lt;br /&gt;&lt;br /&gt;my_file = &#39;01.blend&#39;&lt;br /&gt;&lt;br /&gt;zbuf = StringIO.StringIO()&lt;br /&gt;zfile = gzip.GzipFile(mode=&#39;wb&#39;, fileobj=zbuf)&lt;br /&gt;zfile.write(open(my_file,&#39;rb&#39;).read())&lt;br /&gt;zfile.close()&lt;br /&gt;&lt;br /&gt;open(&#39;tmp.txt&#39;,&#39;w&#39;).write(base64.encodestring(zbuf.getvalue()))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Получили текстовый файл tmp.txt, который весит 543 КБ, но он и хорошенько сжимается, если его попросить об этом.&lt;br /&gt;Нас же интересует содержание этого файла, которое мы прочитаем в переменную, и дальше уже с переменой будем работать. Чтобы не загружать объемом скрипт.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;import sys&lt;br /&gt;import os&lt;br /&gt;import base64&lt;br /&gt;import StringIO&lt;br /&gt;import gzip&lt;br /&gt;import subprocess&lt;br /&gt;&lt;br /&gt;scn =open(&#39;tmp.txt&#39;,&#39;r&#39;).read()&lt;br /&gt;scn = base64.decodestring(scn)&lt;br /&gt;zbuf = StringIO.StringIO(scn)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;zfile = gzip.GzipFile(mode=&#39;rb&#39;,fileobj=zbuf)&lt;br /&gt;file_src = sys.argv[0]&lt;br /&gt;file_name = file_src.split(&#39;\\&#39;)[-1].split(&#39;.&#39;)[0]&lt;br /&gt;open(file_name+&#39;.blend&#39;,&#39;wb&#39;).write(zfile.read())&lt;br /&gt;zfile.close()&lt;br /&gt;&lt;br /&gt;subprocess.Popen(file_name+&#39;.blend&#39;, shell=True)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Я нарочно даю этот скрипт без комментариев – здесь комментировать нечего, я же надеюсь, со строками работать Вы умеете, а вот финальная строка интересная кода заслуживает рассмотрения, но в том плане, что надо знать, что именно она запускает распакованный файл в Blnder’е.&lt;br /&gt;Вот такой легкий скрипт, а сколько всего полезного он может сделать.&lt;br /&gt;Одно из его применений – запуск тех документов, которые сегодня должны быть сделаны.&lt;br /&gt;&lt;br /&gt;Удачного Вам нового года.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/5780639729769472975/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2009/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/5780639729769472975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/5780639729769472975'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2009/12/blog-post.html' title='Снова хулиганим'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-3844843288608391901</id><published>2009-12-18T16:29:00.000-08:00</published><updated>2009-12-18T16:42:33.282-08:00</updated><title type='text'>еще раз о wx, но глубже</title><content type='html'>Этот пост снова посвящен работе с библиотекой wx, и неким закреплением темы рекурсии и функций – все это в одном посте, да простят мне все те, кто ждет от меня советов и трюков именно по Blender’у – Вам сюда (&lt;a href=&quot;http://f1cd.ru/soft&quot;&gt;http://f1cd.ru/soft&lt;/a&gt;), а здесь я показываю азы, не столько Python’а, сколько программирования вообще – что поделать, учитель – он и в Африке учитель. Особенно приятно, что задаются вопросы именно по программированию. Поэтому, начинающие кодеры, этот пост для Вас. Тема и пример успешно обкатаны и перекочевали в Python и Blender (как среду программирования) из Pascal’я. Хотя, все, что когда-то было уже сделано, я не люблю – нет простора для воображения и творческого подхода.&lt;br /&gt;В этом посте я покажу, как сделать оболочку для калькулятора, используя библиотеку wx, но сам калькулятор делать не стану. Не потому, что я такой вредный, а чтобы дать читателю простор воображения. Начнем с некоторого анализа предстоящей работы. Нам нужно будет сделать графическую оболочку, которая содержит кнопки (будем использовать термины Windows – и называть любой графический объект окном). Сами по себе кнопки на окне или фрейме интереса не представляют. Интерес представляет связь между графическим объектом и реакцией на воздействие на этот объект. Говоря проще, как кнопка будет реагировать на нажатие – вот здесь простор воображения, но Трояны писать мы не станем. Как работает библиотека, как происходит связь объектов и действий – обо всем этом я писал. Поэтому сразу переходим к обсуждению логики работы нашего имитатора калькулятора.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBax4rHCde4fod1LatDaNU_w1LxG-UAFyT3mwrFkcvkR3W4RnbsLdbgTdyfe-ZmhnBt6fJVy-BYCOJ21kmq1Yp6eHKFb97oQ6kklVqehsOe8gmpZty1MGCHrndUp4xSQLKodK7qcxS59I/s1600-h/%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA_01.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 243px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBax4rHCde4fod1LatDaNU_w1LxG-UAFyT3mwrFkcvkR3W4RnbsLdbgTdyfe-ZmhnBt6fJVy-BYCOJ21kmq1Yp6eHKFb97oQ6kklVqehsOe8gmpZty1MGCHrndUp4xSQLKodK7qcxS59I/s320/%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA_01.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5416739141519644258&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Он содержит поле для ввода\вывода информации и клавиши, разделить их можно на две группы:&lt;br /&gt;&lt;br /&gt;• Клавиши для ввода данных;&lt;br /&gt;• Клавиши, для выполнения операций&lt;br /&gt;&lt;br /&gt;Операции у нас будут только унарные – нахождение факториала числа, и нахождение суммы всех положительных чисел до заданного. Работать мы будем только с целыми числами, хотя «точка» для создания дробных предусмотрена. Еще есть две кнопки для очистки текстового поля. Собственно говоря все, чтобы работать с бинарными операциями (сложение, вычитание, умножение и деление), надо просто завести еще две переменные для хранение второго операнда (чтобы знать два числа, с которыми будем работать) и переменную для хранения самой операции, которую надо будет произвести.&lt;br /&gt;Клавиши ввода работают очень просто, добавляют то, что на них написано, в текстовое поле. Поэтому мы здесь пойдем на хитрость. И одну и ту же операцию назначим для ряда окон. Работают они одинаково, различие в том, что они добавляют свой Title в текстовое поле. Сгруппируем все клавиши ввода в одно событие, а потом просто, когда это событие произойдет, определим, какое окно его вызвало, и добавим Title с этого окна в поле ввода\вывода. Вроде бы все просто.&lt;br /&gt;Рассмотрим весь этот алгоритм реализованным.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button7)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Подробнее о Bind я уже писал – смотрите мои посты. Так же Bind будет выглядеть для всех остальных окно ввода, разница только в имени окна. Теперь процедура добавления заголовка окна:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;def OnDigitClick(self, event):&lt;br /&gt;        # Получаем список всех окно, которые содержит panel.&lt;br /&gt;        children = self.panel.GetChildren()&lt;br /&gt;        # Находим окно что, вызвало событие.&lt;br /&gt;        for child in children:&lt;br /&gt;            if child.GetId() == event.GetId():&lt;br /&gt;                # Знак, который нужно вывести, содержится в label&#39;e виждета.&lt;br /&gt;                self.textCtrlInfo.AppendText(child.GetLabel())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Остальной код труда не составит, для понимания. Две идентичные функции у меня реализованы разными методами, чтобы показать, что получить одни и тот же результат можно получить разными путями – выбор за Вами.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;# -*- coding: cp1251 -*-&lt;br /&gt;&lt;br /&gt;import wx&lt;br /&gt;&lt;br /&gt;class Frame_main(wx.Frame):&lt;br /&gt;&lt;br /&gt;    def __init__(self, parent):&lt;br /&gt;        self._init_ctrls(parent)&lt;br /&gt;&lt;br /&gt;    def _init_ctrls(self, prnt):&lt;br /&gt;        &#39;&#39;&#39; Инициализирует все видимые компоненты. &#39;&#39;&#39;&lt;br /&gt; &lt;br /&gt;        &lt;br /&gt;        # Создаём главное окно, которое не может изменять размер и разворачиваться на&lt;br /&gt;        # весь экран.&lt;br /&gt;        wx.Frame.__init__(self, id=-1, parent=prnt,&lt;br /&gt;              pos=wx.Point(422, 270), size=wx.Size(258, 222),&lt;br /&gt;              style=wx.DEFAULT_FRAME_STYLE &amp; (~(wx.MAXIMIZE_BOX | wx.RESIZE_BORDER)),&lt;br /&gt;                          title=&#39;Calculator&#39;)&lt;br /&gt;        self.SetClientSize(wx.Size(250, 218))&lt;br /&gt;&lt;br /&gt;        # Созаём панель - на ней будут распологаться все остальные окна.&lt;br /&gt;        self.panel = wx.Panel(self)&lt;br /&gt;        # создаем кнопки&lt;br /&gt;        self.button0 = wx.Button(id=-1, label=&#39;0&#39;,&lt;br /&gt;              name=&#39;button_0&#39;, parent=self.panel, pos=wx.Point(8, 144),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button1 = wx.Button(id=-1, label=&#39;1&#39;,&lt;br /&gt;              name=&#39;button_1&#39;, parent=self.panel, pos=wx.Point(8, 112),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button2 = wx.Button(id=-1, label=&#39;2&#39;,&lt;br /&gt;              name=&#39;button_2&#39;, parent=self.panel, pos=wx.Point(56, 112),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button3 = wx.Button(id=-1, label=&#39;3&#39;,&lt;br /&gt;              name=&#39;button_3&#39;, parent=self.panel, pos=wx.Point(104, 112),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button4 = wx.Button(id=-1, label=&#39;4&#39;,&lt;br /&gt;              name=&#39;button_4&#39;, parent=self.panel, pos=wx.Point(8, 80),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button5 = wx.Button(id=-1, label=&#39;5&#39;,&lt;br /&gt;              name=&#39;button_5&#39;, parent=self.panel, pos=wx.Point(56, 80),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button6 = wx.Button(id=-1, label=&#39;6&#39;,&lt;br /&gt;              name=&#39;button_6&#39;, parent=self.panel, pos=wx.Point(104, 80),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button7 = wx.Button(id=-1, label=&#39;7&#39;,&lt;br /&gt;              name=&#39;button_7&#39;, parent=self.panel, pos=wx.Point(8, 48),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button8 = wx.Button(id=-1, label=&#39;8&#39;,&lt;br /&gt;              name=&#39;button_8&#39;, parent=self.panel, pos=wx.Point(56, 48),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.button9 = wx.Button(id=-1, label=&#39;9&#39;,&lt;br /&gt;              name=&#39;button_9&#39;, parent=self.panel, pos=wx.Point(104, 48),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.buttonFact = wx.Button(id=-1, label=&#39;!&#39;,&lt;br /&gt;              name=&#39;button_fact&#39;, parent=self.panel, pos=wx.Point(56, 144),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.buttonDot = wx.Button(id=-1, label=&#39;.&#39;,&lt;br /&gt;              name=&#39;button_dot&#39;, parent=self.panel, pos=wx.Point(104, 144),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.buttonSum = wx.Button(id=-1, label=&#39;Sum&#39;,&lt;br /&gt;              name=&#39;button_Sum&#39;, parent=self.panel, pos=wx.Point(152, 48),&lt;br /&gt;              size=wx.Size(40, 23), style=0)   &lt;br /&gt;       &lt;br /&gt;       &lt;br /&gt;        self.buttonErase = wx.Button(id=-1, label=&#39;&lt;-&#39;,&lt;br /&gt;              name=&#39;button_erase&#39;, parent=self.panel, pos=wx.Point(200, 48),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;        self.buttonCleanUp = wx.Button(id=-1, label=&#39;C&#39;,&lt;br /&gt;              name=&#39;button_clean_up&#39;, parent=self.panel, pos=wx.Point(200, 80),&lt;br /&gt;              size=wx.Size(40, 23), style=0)&lt;br /&gt;&lt;br /&gt;       # соам поле для ввоа\вывода результатов&lt;br /&gt;&lt;br /&gt;        self.textCtrlInfo = wx.TextCtrl(id=-1,&lt;br /&gt;              name=&#39;textCtrl_info&#39;, parent=self.panel, pos=wx.Point(8, 8),&lt;br /&gt;              size=wx.Size(232, 21), style=0, value=&#39;&#39;)&lt;br /&gt;&lt;br /&gt;# Максимальная длина вводимой строки.&lt;br /&gt;        self.MaxLength = 30&lt;br /&gt;        self.textCtrlInfo.SetMaxLength(self.MaxLength)&lt;br /&gt;        self.errorStatusBar = self.CreateStatusBar()&lt;br /&gt;        #==========================&lt;br /&gt;        # Устанавливаем обработчики событий&lt;br /&gt;        #==========================&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button0)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button1)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button2)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button3)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button4)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button5)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button6)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button7)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button8)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.button9)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnDigitClick, self.buttonDot)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnButtonSumClick, self.buttonSum)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnOButtonFactClick, self.buttonFact)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnButtonEraseClick, self.buttonErase)&lt;br /&gt;        self.Bind(wx.EVT_BUTTON, self.OnButtonCleanUpClick, self.buttonCleanUp)&lt;br /&gt;        self.Bind(wx.EVT_TEXT, self.OnTextCtrlInfoText, self.textCtrlInfo)&lt;br /&gt;&lt;br /&gt;    def OnDigitClick(self, event):&lt;br /&gt;        # Получаем список всех окно, которые содержит panel.&lt;br /&gt;        children = self.panel.GetChildren()&lt;br /&gt;        # Находим окно что, который вызвал событие.&lt;br /&gt;        for child in children:&lt;br /&gt;            if child.GetId() == event.GetId():&lt;br /&gt;                # Знак, который нужно вывести, содержится в label&#39;e виждета.&lt;br /&gt;                self.textCtrlInfo.AppendText(child.GetLabel())&lt;br /&gt;&lt;br /&gt;    def OnButtonEraseClick(self, event):&lt;br /&gt;        &#39;&#39;&#39; Стираем последний символ в строке.&#39;&#39;&#39;&lt;br /&gt;        oldValue = self.textCtrlInfo.GetValue()&lt;br /&gt;        self.textCtrlInfo.SetValue(oldValue[:len(oldValue) - 1])&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    def OnButtonCleanUpClick(self, event):&lt;br /&gt;        &#39;&#39;&#39; Очищаем все данные. &#39;&#39;&#39;&lt;br /&gt;        self.textCtrlInfo.SetValue(&#39;0&#39;)&lt;br /&gt;        self.errorStatusBar.SetStatusText(&#39;&#39;)&lt;br /&gt;&lt;br /&gt;    def OnTextCtrlInfoText(self, event):&lt;br /&gt;        &#39;&#39;&#39; Очищает строку сообщений об ошибках как только начинаем ввод нового&lt;br /&gt;            числа. &#39;&#39;&#39;&lt;br /&gt;        self.errorStatusBar.SetStatusText(&#39;&#39;)&lt;br /&gt;&lt;br /&gt;    def OnOButtonFactClick(self, event):&lt;br /&gt;        &#39;&#39;&#39; считаем факториал числа &#39;&#39;&#39;&lt;br /&gt;        try:&lt;br /&gt;            number = float(self.textCtrlInfo.GetValue())&lt;br /&gt;            # Не выводим &#39;.&#39;, если число целое.&lt;br /&gt;            number = fact(number)&lt;br /&gt;            number = NormalizeNumber(number)&lt;br /&gt;            self.textCtrlInfo.SetValue(str(number))&lt;br /&gt;        except (TypeError, ValueError):&lt;br /&gt;            self.errorStatusBar.SetStatusText&lt;br /&gt;&lt;br /&gt;    def OnButtonSumClick(self, event):&lt;br /&gt;        &#39;&#39;&#39; Меняем знак числа. &#39;&#39;&#39;&lt;br /&gt;        try:&lt;br /&gt;            number = float(self.textCtrlInfo.GetValue())&lt;br /&gt;            # Не выводим &#39;.&#39;, если число целое.&lt;br /&gt;            sum = 0&lt;br /&gt;            while number &gt; 0:&lt;br /&gt;                sum = sum + number&lt;br /&gt;                number = number -1&lt;br /&gt;&lt;br /&gt;            number = sum&lt;br /&gt;            number = NormalizeNumber(number)&lt;br /&gt;            self.textCtrlInfo.SetValue(str(number))&lt;br /&gt;        except (TypeError, ValueError):&lt;br /&gt;            self.errorStatusBar.SetStatusText(&#39;ОШИБКА! Введите число правильно.&#39;)&lt;br /&gt;&lt;br /&gt;def NormalizeNumber(number):&lt;br /&gt;    &#39;&#39;&#39;&lt;br /&gt;    Превращает float в int, если число целое.&lt;br /&gt;    &#39;&#39;&#39;&lt;br /&gt;    if not (number % 1):&lt;br /&gt;        number = int(number)&lt;br /&gt;    return number&lt;br /&gt;&lt;br /&gt;def fact(n):&lt;br /&gt;    if n == 0:&lt;br /&gt;        result = 1&lt;br /&gt;    else:&lt;br /&gt;        result = n*fact(n-1)&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;#======================================================================&lt;br /&gt;#&lt;br /&gt;#=======================основной блок==================================&lt;br /&gt;#&lt;br /&gt;#======================================================================&lt;br /&gt;&lt;br /&gt;class CalcApp(wx.App):&lt;br /&gt;    def OnInit(self):&lt;br /&gt;        self.main = Frame_main(None)&lt;br /&gt;        self.main.Show()&lt;br /&gt;        self.SetTopWindow(self.main)&lt;br /&gt;        return True&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;    application = CalcApp(0)&lt;br /&gt;    application.MainLoop()&lt;br /&gt;&lt;br /&gt;if __name__ == &#39;__main__&#39;:&lt;br /&gt;    main()&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;На скриншоте привожу самый спорный пример кода.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1nuKQaQarXR87Or8d5CYF_i4NHQ_HK2P1PkyndGP4bYlRGbQfkI_k8UCC9wOQTSWCyh_xCQ9tmAA_7Mh-hV6E9igCTYuuQx2WCHImqb_ir2oNahDzTrepGb_b-0FTuDPP6PaiTlPplY8/s1600-h/%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA_02.JPG&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1nuKQaQarXR87Or8d5CYF_i4NHQ_HK2P1PkyndGP4bYlRGbQfkI_k8UCC9wOQTSWCyh_xCQ9tmAA_7Mh-hV6E9igCTYuuQx2WCHImqb_ir2oNahDzTrepGb_b-0FTuDPP6PaiTlPplY8/s320/%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA_02.JPG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5416740135753950306&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Обратите на него внимание. Здесь показано, как строить классы. А пока все. До новых встреч. И на прощание, в школы с 2010 год приходит Linux – очень бы хотел услышать Ваши мысли по этому поводу. Удачного плавания в мире бесплатного софта. До скорых встеч.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/3844843288608391901/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2009/12/wx.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/3844843288608391901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/3844843288608391901'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2009/12/wx.html' title='еще раз о wx, но глубже'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBax4rHCde4fod1LatDaNU_w1LxG-UAFyT3mwrFkcvkR3W4RnbsLdbgTdyfe-ZmhnBt6fJVy-BYCOJ21kmq1Yp6eHKFb97oQ6kklVqehsOe8gmpZty1MGCHrndUp4xSQLKodK7qcxS59I/s72-c/%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA_01.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-4810832117944487361</id><published>2009-11-08T15:41:00.000-08:00</published><updated>2009-11-08T15:48:15.287-08:00</updated><title type='text'>Немного рекурсии, процедур, функций и ностальгии о школе</title><content type='html'>Увы, но даже некоторые учителя информатики не знают различая между процедурой и функцией, а при слове «рекурсия» на них нападает первобытный ужас, и они начинают трястись и плеваться. Больше всего от этого страдают ученики, которые хотят понять и разобраться – инициатива рубится, что говориться, на корню. Что же в стране «полууголовной» романтики – любая инициатива наказуема.&lt;br /&gt;Так же и я, обещая выложить скрипт, генерирующий молнию (смотри комментарии к прошлому посту), опять срулил в диалектическую яму и принялся заниматься своим любимым делом – ругать полуграмотных педагогов информатики, забывши, когда сам крайний раз смотрел на класс. Ругать можно долго – толку только от этого не будет. Да и ясности не прибавится. Поэтому ругать больше никого не стану – ругайте меня, за то, что взялся объяснять самые азы, но кому-то и они пригодятся как для дальнейшего восприятия уже «боевых» скриптов, так и для менее нервного чтения прошлых постов.&lt;br /&gt;Позволю себе еще немного поностальгировать о тех временах, когда возил маркером по доске, рисуя загадочные заклинания на Паскале. Так вот, Паскаль к отступам нечуствительный, на нем всю программу можно писать сплошным текстом, не выделяя ничего – все одно работать будет правильно, если будет, а что в коде потом ничего не понять – так это обычно мало кого волнует, кто смотрит свои программы. Я обычно всегда «гонял» за отсутствие отступов, хотя их не делал почти никто. Python же к отступам чувствителен. Отсутствие или наличие отступов в некоторых местах вызывает критические ошибки – скрипт просто не работает, в других же местах те же самые лишние отступы могут изменить логику выполнения скрипта до неузнаваемости. Вот и получаются ситуации когда все работает, но почему-то не так, как того хочет программист. Вот и начинается баголовительство и непонятные крики – все правильно написано, а работает неправильно, «такого быть не может», «это не возможно», «код верный». Код-то верный. А вот логика не до конца.&lt;br /&gt;Проше всего продемонстрировать работу отступов на уже известном примере, проще, но как тогда связать их с процедурами, функциями и рекурсией?&lt;br /&gt;Итак, код программы поделен на блоки – модули. Некоторые модули импортируются из уже готовых библиотек – их мы разбирали, трогать больше не будем. Некоторые блоки пишутся в самом скрипте, используется ключевое слов def. В python def используется как для процедур так и для функций, а вот в Паскале – нет. Процедура (procedure) и функция (function) разливаются даже в объявлении. Смотрите:&lt;br /&gt;&lt;br /&gt;Procedure MyProc(n:integer);&lt;br /&gt;Begin&lt;br /&gt;End;&lt;br /&gt;&lt;br /&gt;Function MyFunc(n:integer):integer;&lt;br /&gt;Begin&lt;br /&gt;End;&lt;br /&gt;&lt;br /&gt;Разница видна даже в объявлении. Процедура – часть кода что либо делающая, но при этом не возвращающая значения, то есть a := MyProc – в Паскале будет ошибочно, а вот a := MyFunc – вполне работоспособно, так как функция возвращает некоторое значении. Чтобы лучше отложилась эта разница в памяти, вспомним школьное понятие функции (это из алгебры) – некий закон, который ставит в соответствия между числами. Коряво, но понятно. Вот пример: функция – закон f(x)=3*x, вместо х подставляем любое число и получаем его соответствие – вот Вам функция в деле. Теперь посмотрим, как это сделать на python. Закон известен, переменная задана. Выполняем.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Def MyFun(n)&lt;br /&gt; result = 3*n&lt;br /&gt; rerurn result&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Что этот код нам дает? Мы можем использовать функцию f(x)=3*x в более сложных выражениях. Например, g(x) = (f(x))^2 – можно поступить так&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;F = Myfunc(5)&lt;br /&gt;G = f^2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Но это все школьные примеры – они простые для восприятия, поэтому мне нравится.&lt;br /&gt;Теперь приведу пример процедуры. Берем тот же закон, зачем нам что-то думать, и преобразуем функцию (она у нас готова) в процедуру&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Def MyFun(n)&lt;br /&gt; result = 3*n&lt;br /&gt; print( result)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Вычислительная работа та же самая – вот ее результат, в данном случае, мы видим в консоли. Поэтому процедуры используются для прорисовки и связи объектов, функции – для расчета каких либо величин, например, координат точек.&lt;br /&gt;Сейчас мы посмотрим на предыдущий пример еще раз, а после вернемся к рекурсивному вызову функций.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIngh9q3sZ3e_kDXq5AVMmUfT06ZWaDp4cenO68YMiauA6Eial6q1mqGoq77z9NvQp0ku1Tc5oc7LykxrM_Ks4GGtPmz6tJTHVLtNQoz1fcIVHgvEzEiTuxYJIJRcPV6yb9E6hYQ87-90/s1600-h/tec01.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIngh9q3sZ3e_kDXq5AVMmUfT06ZWaDp4cenO68YMiauA6Eial6q1mqGoq77z9NvQp0ku1Tc5oc7LykxrM_Ks4GGtPmz6tJTHVLtNQoz1fcIVHgvEzEiTuxYJIJRcPV6yb9E6hYQ87-90/s320/tec01.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5401883156334128114&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я себе позволил немного порисовать на картинке с кодом, чтобы немного яснее стала структура кода из предыдущего поста. Но поясню теперь по картинке – надеюсь ошибки из-за отсутствия форматирования в листингах сократятся.&lt;br /&gt;Итак, всю работу осуществляет одна функция – main. Дальше, по красной линии переходим в class CalcApp(wx.App), который состоит из одной функции (она помечена цветом) OnInit(self), эта функция отсылает нас к еще одному классу - MyWindow(wx.Frame), который состоит уже из двух функций – их я тоже выделил цветом. Вообще, следовало бы отдельно поговорить о понятии класса и объекта, но к этому при необходимости еще вернемся, а пока продолжим.&lt;br /&gt;Рекурсивный вызов функции означает, что функция вызывает сама себя. И, если не оговорить условия выхода из рекурсии, то возникнет переполнение памяти, а какие проблемы возникнут в этом случае, я Вам сказать не берусь.&lt;br /&gt;Рассмотрим рекурсивный вызов функции на примере подсчета факториала. Помните, что это такое? Это произведение всех чисел, которые идут до заданного, включая заданное. И не улыбайтесь, факториал 5 не равен нулю, так как факториал нуля равен единице. Вот у нас есть все для написания этой не хитрой рекурсивной функции и даже условие выхода. Функция будет работать так:&lt;br /&gt;• Получает некое число – аргумент функции&lt;br /&gt;• Сравнивает его с нулем&lt;br /&gt;o Если число – ноль, то возвращаем значение функции – 1&lt;br /&gt;o В противном случае умножаем это число на результат вызова этой же функции, но с аргументом на единицу меньшим&lt;br /&gt;&lt;br /&gt;def fact(n):&lt;br /&gt; &lt;br /&gt; if n == 0:&lt;br /&gt;  result = 1&lt;br /&gt; else:&lt;br /&gt;  result = n*fact(n-1)&lt;br /&gt; &lt;br /&gt; return result&lt;br /&gt;&lt;br /&gt;Вот все, что мы описывали сделано на языке Python – вызываем функции функцию, хотя бы от пяти:&lt;br /&gt;&lt;br /&gt;g = fact(5)&lt;br /&gt;print(g)&lt;br /&gt;&lt;br /&gt;Проверяем консоль и видим – 120, а не 1, как можно подумать. Почему так получается? Из-за вызова функции самой себя. Я нарисовал картинку, как функция работает.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX9YYcDdlynTg83zxfobF2YfkEqh2sURkccKQ4yZIDjVoeg8oxBLA_CCyrN-1OPcJVAVq2dxDlJjnuQRRL8t2mtSLU2N9t3f-V58A0JA7FFvKQnLDnaCwhrcLzLlJfOo5Engf0PgogUYQ/s1600-h/tec02.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX9YYcDdlynTg83zxfobF2YfkEqh2sURkccKQ4yZIDjVoeg8oxBLA_CCyrN-1OPcJVAVq2dxDlJjnuQRRL8t2mtSLU2N9t3f-V58A0JA7FFvKQnLDnaCwhrcLzLlJfOo5Engf0PgogUYQ/s320/tec02.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5401883473861149666&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Вызов функции состоит из двух частей, сначала мы углубляемся в вызовы функций (левая сторона – черные стрелки), а потом выходим из глубины рекурсии по голубым стрелкам (правая часть картинки). Картинка так же актуальна для понятия стека, но всему свой черед.&lt;br /&gt;&lt;br /&gt;На этом объяснения можно закончить – пост получился чисто теоретический, никакого отношения к Blender’у не имеющий, но что же, теория тоже бывает полезна, особенно, если работа идет со сложными объектами. Прощу прощения, если рассказал всем известные вещи, но прощаться буду шуткой. У нас в руках функция факториала, никакому человеку, знающему математику, не придет в голову вызывать ее с отрицательным аргументом. Но мы же не теоретики-математики, а практики в свободном поиске…так что, при написании кода следует избегать вот таких результатов работы безобидной функции в 11 строчек с пробелами.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeoFbWCitV1m697ra_BZdOMjo-G-zdz6FljrJzGSyh-6m3rmPKHQhW2HAAc1Q5hGiX4F3Hm7ExlDDrUE56cf35yS386ri3Re8kH-az9I-Y93Cp8hTP_yY9PLI61nurtJIdG8UbUK3Izyk/s1600-h/tec03.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 161px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeoFbWCitV1m697ra_BZdOMjo-G-zdz6FljrJzGSyh-6m3rmPKHQhW2HAAc1Q5hGiX4F3Hm7ExlDDrUE56cf35yS386ri3Re8kH-az9I-Y93Cp8hTP_yY9PLI61nurtJIdG8UbUK3Izyk/s320/tec03.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5401883718372426242&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Так что будьте внимательны, не забывайте о духе исследования. А где эта функция может пригодиться в Blender – генерация точек. Удачи Вам.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/4810832117944487361/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2009/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/4810832117944487361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/4810832117944487361'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2009/11/blog-post.html' title='Немного рекурсии, процедур, функций и ностальгии о школе'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIngh9q3sZ3e_kDXq5AVMmUfT06ZWaDp4cenO68YMiauA6Eial6q1mqGoq77z9NvQp0ku1Tc5oc7LykxrM_Ks4GGtPmz6tJTHVLtNQoz1fcIVHgvEzEiTuxYJIJRcPV6yb9E6hYQ87-90/s72-c/tec01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-4524178757219286451</id><published>2009-10-11T14:51:00.001-07:00</published><updated>2009-10-11T14:56:38.351-07:00</updated><title type='text'>О совершенно посторонних библиотеках</title><content type='html'>Несколько постов подряд я пытаюсь показать, как можно использовать Blender не по назначению. Я стараюсь показать, что Blender так же является мощной средой программирования. Получилось мне это показать? Может, и да. Но лично я бы не поверил в то, что Blender можно использовать как независимую студию программирования, пусть даже на динамично развивающемся языке Python, если каждый рабочий скрипт начинается с такой строчки: import Blender. Подозрительно как-то, Вы не находите?  Вот нашел. Итак, мы имеем скрипт, переворачивающий число – записывающий последовательность цифр в обратном порядке, если хотите. Вообще, любую самую тривиальную задачу можно сформулировать очень и очень красиво, но суть данного поста вот в чем – ответить на вопрос, возможно ли использовать Blender, как полноценная студия программирования, но при этом не использовать библиотеку Blender. Все это надо, чтобы в корне отсечь, возможности оппонента говорить, что без библиотеке Blender (import Blender) Blender (уже редактор) как студию программирования использовать нечего.&lt;br /&gt;А за одно попробуем уйти от интерфейса командной строки и Blender’a – будет еще один повод поговорить о независимости Blender’а. Вы думаете невозможно? Возможно все, главное хотеть.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXY63bH3oYSUtf-D46T9KanhvNIIRyLjiNjz1qr7AMaiq52akV4jXfWKdLJeyx-91Ax8FGfKjgQ-7_ndq2SnJ1dDoGby2rOnEdUFjvv-x0ChA89F9JnkF4H3FYv8cGBwnbfGU_znRoaHA/s1600-h/int01.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 192px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXY63bH3oYSUtf-D46T9KanhvNIIRyLjiNjz1qr7AMaiq52akV4jXfWKdLJeyx-91Ax8FGfKjgQ-7_ndq2SnJ1dDoGby2rOnEdUFjvv-x0ChA89F9JnkF4H3FYv8cGBwnbfGU_znRoaHA/s320/int01.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5391463835301659426&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Как Вам интерфейс для нашей программки-переворотчика чисел? Симпатичный, правда?&lt;br /&gt;Написан он с помощью библиотеки wx. Скачать эту библиотеку можно отсюда &lt;a href=&quot;http://wxPython.org&quot;&gt;http://wxPython.org&lt;/a&gt;. Я использую вариант этой библиотеки для Windows, но на сайте можно найти варианты библиотеки и для других систем.&lt;br /&gt;Часть кода можно увидеть не на скриншоте, но все же лучше продублирую код целиком:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;import wx&lt;br /&gt;&lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;autor : ArkSmoke&lt;br /&gt;url   : http://arkpython.blogspot.com&lt;br /&gt;date  : 10.09&lt;br /&gt;data  : work with wx in Blender &lt;br /&gt;   &lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class MyWindow(wx.Frame):&lt;br /&gt; def __init__(self):&lt;br /&gt;  wx.Frame.__init__(self, id = -1, parent = None, pos = wx.Point(0,0), size = wx.Size(250,150), title = &#39;My first Window with Blender&#39;)&lt;br /&gt;  self.panel = wx.Panel(self)&lt;br /&gt;  self.buttonResult = wx.Button(id=-1, label=&#39;Work&#39;,name=&#39;button_work&#39;, parent=self.panel, pos=wx.Point(100, 70), size=wx.Size(50, 23), style=0)&lt;br /&gt;  &lt;br /&gt;  self.textCtrlInfo = wx.TextCtrl(id=-1, name=&#39;textCtrl_info&#39;, parent=self.panel, pos=wx.Point(8, 8), size=wx.Size(232, 21), style=0, value=&#39;1234567&#39;)&lt;br /&gt;  self.Bind(wx.EVT_BUTTON, self.OnOperationClick, self.buttonResult)&lt;br /&gt;  &lt;br /&gt; def OnOperationClick(self,event):&lt;br /&gt;  try:&lt;br /&gt;   number = int(self.textCtrlInfo.GetValue())&lt;br /&gt;  except (TypeError, ValueError):&lt;br /&gt;   print(&#39;error&#39;)&lt;br /&gt;   return&lt;br /&gt;  dt = number&lt;br /&gt;  td = 0&lt;br /&gt;  while dt &gt; 0:&lt;br /&gt;   td = td * 10 +(dt % 10)&lt;br /&gt;   dt = dt // 10&lt;br /&gt;&lt;br /&gt;  self.textCtrlInfo.SetValue(str(td)) &lt;br /&gt;  &lt;br /&gt;class CalcApp(wx.App):&lt;br /&gt;    def OnInit(self):&lt;br /&gt;        self.main = MyWindow()&lt;br /&gt;        self.main.Show()&lt;br /&gt;        self.SetTopWindow(self.main)&lt;br /&gt;        return True&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;    application = CalcApp()&lt;br /&gt;    application.MainLoop()&lt;br /&gt;&lt;br /&gt;main()&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Ну как Вам – скрипт в 46 строк уже более или менее серьезная вещь. Но давайте посмотрим, как он работает. Главная функция в нем – &lt;span style=&quot;font-style:italic;&quot;&gt;main()&lt;/span&gt;. Вы же помните логику работы всех приложений с окнами?&lt;br /&gt;Пока существует окно, отслеживаются и обрабатываются все события, связанные с этим окном. К слову сказать, закрытие окна тоже событие, которое, впрочем, может не останавливать работу программы, но об этом говорить мы не станем.&lt;br /&gt;Цикл обработки событий в Delphi осуществляется следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;While GetMessage(Msg,0,0,0) do begin&lt;br /&gt; TranslateMessage(Msg);&lt;br /&gt; DispatchMessage(Msg);&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;простите не сумел удержаться, что не вставить кусок из этого языка – часто еще думаю именно на Pascal’е. Но это цикл для работы с GUI, если же Вы используете интерфейс командной строки, то для этой цели можно использовать бесконечный цикл while. Оговорив условия выхода – например, команда Quit, или номер пункта меню, соответствующий выходу из цикла – простор воображения.&lt;br /&gt;Но все это я рассказал для того, чтобы Вы вспомнили принцип работы программ – работать до тех пор, пока не получена команда прекратить работу. Отсутствие события – тоже событие, которое обрабатывается определенным образом, например, переход в программу скринсайвер. Логично? Логично. Едем дальше.&lt;br /&gt;Нечто подобное происходит и в Python при использовании библиотеки wx – этим занимается MainLoop(), но, для начала, нужно указать с каким именно окном мы работаем. Первая строчка функции main()&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;application = CalcApp()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;CalcApp() – это уже наш собственный класс, в котором мы создаем окно и все события, связанные с ним. Собственно говоря, у нас есть всего одно событие – нажатие на кнопку. А вот само окно и все объекты, находящиеся на окне создавать придется соответствующими функциями: wx.Button – для кнопки и wx.TextCtrl – для текстового поля.&lt;br /&gt;В классе CalcApp() основой является окно - MyWindow(). Тоже самодельный класс, именно в нем и описано все, что касается окна.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;class CalcApp(wx.App):&lt;br /&gt;    def OnInit(self):&lt;br /&gt;        self.main = MyWindow()&lt;br /&gt;        self.main.Show()&lt;br /&gt;        self.SetTopWindow(self.main)&lt;br /&gt;        return True&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Остальное нужно отображения нашего окошка, чтобы оно было видимым или нет. Вы только вдумайтесь невидимые окна! Но о хулиганстве писать не буду.&lt;br /&gt;Переходим к классу MyWindow(). Он состоит из описания главного окна и всех компонентов, которые располагаются на главном окне.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;wx.Frame.__init__(self, id = -1, parent = None, pos = wx.Point(0,0), size = wx.Size(250,150), title = &#39;My first Window with Blender&#39;)&lt;br /&gt;  self.panel = wx.Panel(self)&lt;br /&gt;  self.buttonResult = wx.Button(id=-1, label=&#39;Work&#39;,name=&#39;button_work&#39;, parent=self.panel, pos=wx.Point(100, 70), size=wx.Size(50, 23), style=0)&lt;br /&gt;  &lt;br /&gt;  self.textCtrlInfo = wx.TextCtrl(id=-1, name=&#39;textCtrl_info&#39;, parent=self.panel, pos=wx.Point(8, 8), size=wx.Size(232, 21), style=0, value=&#39;1234567&#39;)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Самое главное в этом классе – связь между событием – нажатием кнопки и самой этой кнопки.&lt;br /&gt;&lt;br /&gt; s&lt;span style=&quot;font-style:italic;&quot;&gt;elf.Bind(wx.EVT_BUTTON, self.OnOperationClick, self.buttonResult)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Функция &lt;span style=&quot;font-style:italic;&quot;&gt;Bind()&lt;/span&gt; осуществляет эту связь. Первый параметр показывает от какого объекта приходит событие, второй параметр – какое именно событие, тритий – уточнят имя побеспокоенного объекта.&lt;br /&gt;Соответственно реакция объекта располагается во втором параметре.&lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;font-style:italic;&quot;&gt;def OnOperationClick(self,event):&lt;br /&gt;  try:&lt;br /&gt;   number = int(self.textCtrlInfo.GetValue())&lt;br /&gt;  except (TypeError, ValueError):&lt;br /&gt;   print(&#39;error&#39;)&lt;br /&gt;   return&lt;br /&gt;  dt = number&lt;br /&gt;  td = 0&lt;br /&gt;  while dt &gt; 0:&lt;br /&gt;   td = td * 10 +(dt % 10)&lt;br /&gt;   dt = dt // 10&lt;br /&gt;&lt;br /&gt;  self.textCtrlInfo.SetValue(str(td))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;В самом перевороте числа произвел небольшие изменения, все же число мы получаем из текстового поля и результат возвращаем в это же самое поле.&lt;br /&gt;&lt;br /&gt;Вот вроде бы и все. Blender может прекрасно работать и с библиотеками, которые не входят в поставку как самого Blender’a, так и самого Python. Хотя, может быть, с библиотекой wx работать удобнее, используя некие студии, позволяющие делать интерфейсы будущих программ визуально, но любая такая студия, берущая на себя рутинную работу, добавляет свой код, который может увеличить, как объем скрипта, так и сказаться на скорости его работы. В общем, приобретая что-то, что-то обязательно теряешь. Всегда все можно прописать руками, тогда уже знаешь каждую строчку и ориентироваться легче, хотя на первый взгляд это кажется и дольше сложнее. Но, где сложнее, там достойнее.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/4524178757219286451/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2009/10/blog-post_11.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/4524178757219286451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/4524178757219286451'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2009/10/blog-post_11.html' title='О совершенно посторонних библиотеках'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXY63bH3oYSUtf-D46T9KanhvNIIRyLjiNjz1qr7AMaiq52akV4jXfWKdLJeyx-91Ax8FGfKjgQ-7_ndq2SnJ1dDoGby2rOnEdUFjvv-x0ChA89F9JnkF4H3FYv8cGBwnbfGU_znRoaHA/s72-c/int01.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-1756635639937521179</id><published>2009-10-08T14:37:00.000-07:00</published><updated>2009-10-08T14:39:18.345-07:00</updated><title type='text'>О многообразии нахождения команд Змеем</title><content type='html'>Не знаю, как Вам, а мне всегда было интересно, как осуществляется связь между различными частями одной программы. Стоит оговориться, что здесь под программой я имел ввиду, именно код, а не исполняемый файл, или слепок памяти. А вообще с терминологий надо быть предельно аккуратными и тщательно подбирать каждое слово, претендующие на термин. Увы, аккуратностью я страдаю, особенно, когда работа нацелена на результат.&lt;br /&gt;Не будем вдаваться в подробности организации пространства имен в Python. Откуда и как наш змей берет имена. Давайте лучше посмотрим, как мы можем ему показать, откуда эти имена взять. Этим занимается инструкция – import. Ну Вы с ней знакомы. А теперь давайте попробуем вызвать команду Register(), с параметром None, вместо всех запрашиваемых параметров.&lt;br /&gt;Функция Register позволяет использовать None вместо ее параметров, но злоупотреблять этой возможностью мы не станем. В дальнейшем. В этом же посте мы передадим три параметра None, чтобы не возникло ошибок при работе скрипта, но при этом он ничего не сделал бы.&lt;br /&gt;Итак. в прошлом посте мы просто вызвали Register с нужными параметрами. Попробуйте в том скрипте (см. предыдущий пост) заменить все в Register параметром None. Ошибки не возникло, но и работы тоже. Хотя скрипт корректно выполнил свою работу. Чтобы в этом убедиться, допишите после Register(None, None, None) инструкцию print(‘done’). Теперь просто проверим консоль и убедимся – скрипт работает верно.&lt;br /&gt;Создаем новый скрипт. И пытаемся в нем вызвать Register(None, None, None). ЄAaолучилось? У меня влезла ошибка. Ну как так Register is not defined? В прошлый раз же он был вполне defined. Ну в прошлый раз у нас и билиотека Blender была imported =) импортирована. Импортируем.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;import Blender&lt;br /&gt;Register(None,None,None)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;И снова наша функция не определена. Но она же точно есть – прошлый скрипт тому пример. Стираем наш Register(), от которого толку нет и так – он все еще не определен. И работаем с Boender. Просто попробуем найти в нем эту функцию.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;Blender.Draw.Register(None,None,None)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Нашли. Заработала наша функция.&lt;br /&gt;Продолжаем исследовать дальше. Сотрем Blender перед первой точной. Что за чудеса? На этот раз не определен Draw. Попробуем определить его.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;import Blender&lt;br /&gt;from Blender import Draw&lt;br /&gt;Draw.Register(None,None,None)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Скрипт работает снова. Теперь попытаемся вызывать наш Register без всяких там точек. Для этого модифицируем 2ю строку.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;import Blender&lt;br /&gt;from Blender.Draw import *&lt;br /&gt;Register(None,None,None)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Вот и вся любовь. Register стал определенным.&lt;br /&gt;&lt;br /&gt;А теперь посчитайте, сколькими различными способами, мы вызвали одну функцию? Вот сколько путей сделать одно и тоже действие, и соответственно, при каждом действии код будет выглядеть иначе, хотя делать будет одно и тоже. Что выбирать, зависит только от Ваших предпочтений. Удачи Вам и до скорых встреч.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/1756635639937521179/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2009/10/blog-post_08.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/1756635639937521179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/1756635639937521179'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2009/10/blog-post_08.html' title='О многообразии нахождения команд Змеем'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-2328438933747836235</id><published>2009-10-04T15:12:00.000-07:00</published><updated>2009-10-04T15:18:08.704-07:00</updated><title type='text'>Необычная среда для обычных задач</title><content type='html'>Я давно перестал верить глазам своим: одну причину я уже демонстрировал, теперь хочу поговорить о еще одной. Так мне кто-нибудь сможет ответить: Blender – это редактор трехмерной графики с возможностью программирования или – среда разработки на Python с мощными графическими возможностями. До недавнего времени, я считал, что первый вариант. Однако, программирование графики – сама по себе, задача не из простых. В некоторых средах программирования разработка графики – дело, требующие хорошей подготовки. Меня поймут те, кому доводилось писать графику, используя библиотеки DirectX или OpenGL. Bender не знаком с Direct’ом, но зато очень близко знает OpenGL. Если в Blender можно программно рисовать, то с задачами на расчеты он должен справляться вполне успешно. Проверим это предположение. Напишем в Blender следующий скрипт:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;dt = 1234567&lt;br /&gt;td = 0&lt;br /&gt;&lt;br /&gt;while dt &gt; 0:&lt;br /&gt; td = td * 10 +(dt % 10)&lt;br /&gt; dt = dt // 10&lt;br /&gt; &lt;br /&gt;print (td)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Как видно, простая школьная задача по программированию решена: данное число записано задам наперед. Этот скрипт продемонстрировал нам возможность решать в Blender целый класс школьных задач по программированию. В частности, мы можем узнать, является ли данное число числом-перевертышем или же является данное число счастливым числом (естественно, сделав необходимые проверки).&lt;br /&gt;В этом скрипте мне не нравится один момент: всегда ли нужно, проверяя новое число, вводить его в скрипт или же есть какая другая возможность? Она есть – и не одна. Можно соорудить свой собственный интерфейс для комфортной работы со скриптом. Правда в большинстве школьных задач, даже олимпиадного уровня, не требуется создания GUI, а ввод и вывод данных осуществляется в текстовые или типизированные файлы. Так как, я уже не школьник, а Blender обладает мощными графическими возможностями, то сооружать я буду именно GUI. Придется мудрить со скриптом, создавая оболочку для контроля его выполнения. А когда нас пугала работа с API – функциями? Никогда. Даже всегда интересовала.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY_FAhxfjyd3G-8FU1g66W38muH96LhOd57ukXGR6M681s_rxCrrzGYH_Ap1AzXPNd5yr_vHRG0V1Wy2_jx1Jf0jKL4gFiNSOOF68yYwy6GdUmaI3P4YAxr1_iZehxSrNOSwC2Bq-bLOU/s1600-h/ref01.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY_FAhxfjyd3G-8FU1g66W38muH96LhOd57ukXGR6M681s_rxCrrzGYH_Ap1AzXPNd5yr_vHRG0V1Wy2_jx1Jf0jKL4gFiNSOOF68yYwy6GdUmaI3P4YAxr1_iZehxSrNOSwC2Bq-bLOU/s320/ref01.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5388871795449606850&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Довольно достойно получилось. Как Вы считаете? Скрипт выкладываю полностью – основная его ценность, конечно, не в решении задачи, которую решать в Blender’е мало кому придет  голову, а в том, что основная нагрузка данного скрипта состоит именно в создании GUI.&lt;span style=&quot;font-style:italic;&quot;&gt;&lt;br /&gt;&lt;br /&gt;import Blender&lt;br /&gt;from Blender.BGL import *&lt;br /&gt;from Blender.Draw import *&lt;br /&gt;&lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;autor : ArkSmoke&lt;br /&gt;url   : http://arkpython.blogspot.com&lt;br /&gt;date  : 10.09  &lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;DATA = Create(1234567)&lt;br /&gt;ATAD = Create(0)&lt;br /&gt;&lt;br /&gt;EVENT_NOEVENT = 1&lt;br /&gt;EVENT_EXIT = 2&lt;br /&gt;EVENT_DRAW = 3&lt;br /&gt;&lt;br /&gt;def draw():&lt;br /&gt; &lt;br /&gt; global DATA&lt;br /&gt; global EVENT_NOEVENT,EVENT_EXIT,EVENT_DRAW&lt;br /&gt; &lt;br /&gt; glClear(GL_COLOR_BUFFER_BIT)&lt;br /&gt; DATA = Number(&quot;No. of sides: &quot;, EVENT_NOEVENT, 10, 55, 210, 18, DATA.val, 10, 99999999, &quot;Number of sides of out polygon&quot;);&lt;br /&gt; Button(&quot;Draw&quot;,EVENT_DRAW, 10, 10, 80, 18)&lt;br /&gt; Button(&quot;Exit&quot;,EVENT_EXIT, 140, 10, 80, 18)&lt;br /&gt; &lt;br /&gt;def event(evt, val): &lt;br /&gt; if (evt == QKEY and not val): &lt;br /&gt;  Exit()&lt;br /&gt;  &lt;br /&gt;def bevent(evt):&lt;br /&gt;    global DATA&lt;br /&gt;    global EVENT_NOEVENT,EVENT_DRAW,EVENT_EXIT&lt;br /&gt;&lt;br /&gt;    if (evt == EVENT_EXIT): &lt;br /&gt;        Exit()&lt;br /&gt;    elif (evt== EVENT_DRAW):&lt;br /&gt;        ref(DATA.val)&lt;br /&gt;          &lt;br /&gt;&lt;br /&gt;def ref(dt):&lt;br /&gt; td = 0&lt;br /&gt;&lt;br /&gt; while dt &gt; 0:&lt;br /&gt;  td = td * 10 +(dt % 10)&lt;br /&gt;  dt = dt // 10&lt;br /&gt; print(&#39;done &#39;,td)&lt;br /&gt; &lt;br /&gt;Register(draw, event, bevent)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;К вопросу о GUI в Blender я еще вернусь, как и к вопросу о решении олимпиадных задач в нем. Но всему - свое время. От простого к сложному.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/2328438933747836235/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2009/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/2328438933747836235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/2328438933747836235'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2009/10/blog-post.html' title='Необычная среда для обычных задач'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY_FAhxfjyd3G-8FU1g66W38muH96LhOd57ukXGR6M681s_rxCrrzGYH_Ap1AzXPNd5yr_vHRG0V1Wy2_jx1Jf0jKL4gFiNSOOF68yYwy6GdUmaI3P4YAxr1_iZehxSrNOSwC2Bq-bLOU/s72-c/ref01.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2339343325189154359.post-73830707714324480</id><published>2009-09-30T13:48:00.000-07:00</published><updated>2009-09-30T14:17:19.283-07:00</updated><title type='text'>Не верь глазам своим</title><content type='html'>То, что мы не верим глазам своим, стало нормой нашей жизни. Мы перестали верить всему на этом свете: глазам, ушам, чувствам, соседям, друзьям, ученым болтунам и ученым молчунам, книги фантастов, не знаю, как Вам мне, стали скучны, единственное, что греет душу – классика.&lt;br /&gt;Здесь я хочу показать как можно с помощью одного скрипта на Python обмануть всех. Вот смотрите, что Вы видите на этой картинке:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6wbZbWPDH2U5AovJcLUauhuDUcdQol8zX-L2wSBDweG89o5_rRaktHJldsCgTDCVK-ZKsDDOpoW6cEqRHrsTxBMak2jKf_txqK-2oVT5pe_b-dgnHQhIovM8-RiPVtkVU0OWK5VoQyes/s1600-h/01.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6wbZbWPDH2U5AovJcLUauhuDUcdQol8zX-L2wSBDweG89o5_rRaktHJldsCgTDCVK-ZKsDDOpoW6cEqRHrsTxBMak2jKf_txqK-2oVT5pe_b-dgnHQhIovM8-RiPVtkVU0OWK5VoQyes/s320/01.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5387366296508142546&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Правильно, светящийся шар. Как Вы думаете, я сделал его? Использовал ли я сферу для этих целей или нет? Конечно же, да. А вот тут и ошибка не использовал я никаких сфер. Не верите? Смотрите сами.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrzqft_q7JowfWTKdjaShWDrgtic0L9tVQv-B6KjrvbUm0wxZpIVp1CJXiYNT8GBvolNAKSWypnSg1b5rw4ofALuhONwAm4h70zyjPUNzApHbyQbazs-kHrjyf5A8Z9Pe3rRFe4t0afc8/s1600-h/02.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrzqft_q7JowfWTKdjaShWDrgtic0L9tVQv-B6KjrvbUm0wxZpIVp1CJXiYNT8GBvolNAKSWypnSg1b5rw4ofALuhONwAm4h70zyjPUNzApHbyQbazs-kHrjyf5A8Z9Pe3rRFe4t0afc8/s320/02.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5387367076911459842&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Видите ли Вы здесь хоть что-то напоминающие сферу. Правильно, нет. Ее здесь и нет. И как же я из куба получил сферу. Вообще я использовал скрипт, можно обойтись без него, но мы легких путей не ищем.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3qUrPsa_9iXkYdMKu8XV-mGykVaUQUy_zMRDFEg-nO7W-OyGUBkR6TAKaDEVWBqoP06EG3rqIfb5YwdLVNxkBM_JtG9h30bQ0T92sQJqk9cswdAE2I6YWMUIOQrFOHqCcnggDtuEl85U/s1600-h/03.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3qUrPsa_9iXkYdMKu8XV-mGykVaUQUy_zMRDFEg-nO7W-OyGUBkR6TAKaDEVWBqoP06EG3rqIfb5YwdLVNxkBM_JtG9h30bQ0T92sQJqk9cswdAE2I6YWMUIOQrFOHqCcnggDtuEl85U/s320/03.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5387367780536501090&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Применяем скрипм, делаем рендер и наслаждаемся солнцем. Вот текст скрипта.&lt;br /&gt;&lt;br /&gt;import Blender&lt;br /&gt;from Blender import *&lt;br /&gt;import bpy&lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;autor: ArkSmoke&lt;br /&gt;url  : arkpython.blogspot.com/&lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;mat = Blender.Material.New(&#39;my&#39;)&lt;br /&gt;mat.rgbCol = [0,1,1]&lt;br /&gt;mat.emit = 1&lt;br /&gt;mat.setMode(&#39;Halo&#39;)&lt;br /&gt;mat.setHaloSize(5)&lt;br /&gt;mat.setAdd(7)&lt;br /&gt;mat.setFlareSize(12)&lt;br /&gt;obj = Blender.Object.GetSelected()[0]&lt;br /&gt;msh = Blender.Mesh.Get(obj.data.name)&lt;br /&gt;msh.materials = [mat]&lt;br /&gt;for fc in msh.faces:&lt;br /&gt;    fc.mat = 0&lt;br /&gt;Window.RedrawAll()&lt;br /&gt;print mat.rgbCol&lt;br /&gt;листинг 1&lt;br /&gt;Так что понятие формы вопрос очень сложный и неоднозначный. И даже если перед Вами явная сфера стоит задуматься, а сфера ли это?&lt;br /&gt;Не доверяйте глазам своим и не попадайте в неприятные ситуации, не позволяйте обманывать себя, особенно на вокзалах.&lt;br /&gt;Удачи во всем и всегда.</content><link rel='replies' type='application/atom+xml' href='http://arkpython.blogspot.com/feeds/73830707714324480/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://arkpython.blogspot.com/2009/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/73830707714324480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2339343325189154359/posts/default/73830707714324480'/><link rel='alternate' type='text/html' href='http://arkpython.blogspot.com/2009/09/blog-post.html' title='Не верь глазам своим'/><author><name>Аркадий</name><uri>http://www.blogger.com/profile/10172971477537130759</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6wbZbWPDH2U5AovJcLUauhuDUcdQol8zX-L2wSBDweG89o5_rRaktHJldsCgTDCVK-ZKsDDOpoW6cEqRHrsTxBMak2jKf_txqK-2oVT5pe_b-dgnHQhIovM8-RiPVtkVU0OWK5VoQyes/s72-c/01.jpg" height="72" width="72"/><thr:total>0</thr:total></entry></feed>