""" This is the GUI for the Animation Control Panel """ from direct.interval.IntervalGlobal import * from direct.actor.Actor import * from panda3d.core import VBase3,VBase4 import ObjectGlobals as OG import AnimGlobals as AG import os,wx, time from wx.lib.embeddedimage import PyEmbeddedImage #---------------------------------------------------------------------- FirstFrame = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACh0lE" "QVRIie2Uz08aQRTHd368CZzYGGNjPWkTlB7EK0QSewSSamL9R+upXmpko/LLskgqhrDGyqb4" "Y40CB3dnd6aHMYBIjSZe2vhOk/2+93nf93Z3UOvsTHvtwK9OfIP+f1CEEKUUITRWJYQQQl4A" "RQgBpQihVqvV6/UwflBCCGGM3XY6tm33H9JhGWPMOR9xFwhhnZzs7e21bPvL+rqu60KIe3eU" "3tzcVCqVQqHwYW5ubW0tCIIBlDFmmmbTsjLptBoEADjnjUajWCodHx/3er2JiQklqWEdxzGr" "1R8HB7/bbU3TotHoqFOMcfv8vFarZdJpxpjruvV6vVAs1ut1z/MopQBACAEAAGi32xXTLJfL" "l5eXGGMAUJ3Gj88Y45w3LSu/v9+0LNd1AYAxpmlaEASE0uvr659HR+Vy2XEcla9pmpRS0zQy" "tOsBFCEkhPi2tZXP533fD4VCqqY/iue6Xzc3r66uGGPDUr98kNw/SSkJIclE4tPKiq7rnHNl" "QYUQIhwOp5aXF+bnlfERKKUDf3RYkFJOTk5ms9n40lJuZ6d6eOh5HgDcu5AyFoslk8liqWQY" "xsXFxcjnOQYqhPB9PwgCzvn76emNjY3FeNzI5ZrNpjKMCQmCAACSicR8NLqfz5dLpU63q9Dk" "sVMhRCQSmZmZQQhJKTnnCKGPsdjc7KxpmoZhtGxbCIEwVr11Xc9mMvHFxZ1crlarqfzBfp++" "+THGlNLbTmd3d/fX6enn1dV3U1O+7ysVAIQQjUbj+/Z2bGEhlUqpXT+AKpuP0WpxjuOEw+FQ" "KDScgxACgG63e3d3F4lEnuV0uFi1HNtVXQjq99VG3v4T8Tecij7uvsczoS+KN+g/Av0D3hpG" "5dYDHHkAAAAASUVORK5CYII=") #---------------------------------------------------------------------- PreFrame = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACQ0lE" "QVRIieWVzW4aMRSFbV+DCHTDJlkAYZMKAek2fQHYddElu/SteA+eoNk0iPA7BBBQgtQJI6Gi" "ZoQKM2PP2F24P2RmKFGVRauenSX707nH99r4XtfRc4s8O/G/ghKMMcaHoQAAAIdxhFBKGeeM" "MR/XDxVCrFYr0zQP4hzH0TStVqvpuk4p3d3waAEA6/W6Wq2m0ul3l5cIISmlDwcAm81mPp83" "m827+ZwCFAoFn9NHUEXZWpZt20F3GGPLsiaTidbvz2Yzx3EQQvFkkgSy8kPVeUJ+xQIACjcc" "DjudziddZ4ypBIQQyshh6C4OIWSa5sfZrNVqGYZh2zal9GeCUkq19KUUDsUIUUpN0xwOh71e" "b2EYnHNCSCQSCe5EgZYKgWKMGefvr64Gt7f3i4XnebvuQhQoP7z5CSG2ZX15ePA8T2W6D+i7" "gL1OpZQUoFwuF4vFD9fXo9HI2m6B0lA0CZuU8KJUPelM5u3Jyavz80ajMZ1OXdf9vesDUOXX" "c10gpFAsZk5PB4NBvV5fLpdCiF1rT70oH5ozFj86en1x8fLsrN1ud7vdz6sVAKgo1UPxpJby" "SQghhEgmk6VSKZ/PN25u+pq2tSzFCsYRMqacc9d1g2jP8xBCqVTqzfFxsVCo1+vj8Zgx9n2u" "9kGFEIlEolKpJOJxGeg+Jdd1CSG5XC6bzbbabcMwghOFfR8fxjgajQohOOfhWfyQyvTrZgOE" "xGKxXW5I+er5OSghBEboRSIhpfyTi9oniZAMBIr+0o/vH4d+A5itKwKTfnzPAAAAAElFTkSu" "QmCC") #---------------------------------------------------------------------- PreKeyFrame = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACPUlE" "QVRIib3Vz0/aYBgH8OfHiyTGgAsciJMl6A5j7OLO4+48eHT/qjflSDPlRweNEqPGrTF2hQwW" "gbR9nx2Yi9Ii1bE9x7b55Pu87/Ok+PXqChZdtHDxv6FEsLS0UJQZXVcdHIBSi0OJ0HXV4aHE" "QJmZmGOgML99BCAipZTjOPVard/vE00jT2gTEYkIEV3XbZpms9HwfP/T3l4mk9FaPwdVSmmt" "v7uuaZqmaV5fX2utX66tEbOIPC0pIjIzANi23basRqPR7XaDIGBmRAQACImPoZNmtda2bbda" "raZpOo4zeaiUAgARYebwgUajiJhIJPzR6Jtt12u1k5OTG8f5Y90vVgrjoIQ4Ho/Pz87ax8df" "TLM/GABAIpGIbkckVvtE9PP2dn9//8KyiFkp9fvsogoRI99Ohw+CIJ1K7e7ulsvllZWVIAim" "xuVBIqVinakAIFE+n8/t7LwtlarVauf0dDgaRUeeMQDRt+95HiG+3tx8lc+32m2jWr24vASA" "yfDPCj4HBQAR8X2fmd9vbW0UCs1m8/PRkXNzowH4buUnIxW+qTnDLyKe56VSqQ/l8pti0TCM" "Rr3+o9+fuDwjeKw1DYIAAbKZzMft7WKxaBiGZVnD4XDWHcbdfZnQiBuFwvr6eqfTqVQqAhBe" "/Blo1Hd3b8T3fSZ6Vyrlcrler7eUTIbzhlBEmLU/92jP816srqbTaREJh8UHv2hEGI9xMJBs" "9pG8c+thUhFIJmV5GXz/2SJE/E5E/lKMQhdR/wT9BR51CSZZ1VE7AAAAAElFTkSuQmCC") #---------------------------------------------------------------------- PrePlay = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACV0lE" "QVRIic2Vz1PaUBDHs5tkH9jROv4LDhUHrLXOlOml/p3+H/VYg6YJQz3UWkDDAJlob8J4AUxq" "3tse4lBKEIV6cI9vdz7vuz/eW/h1daU9t+GzE18kFBERpxAWhAJAJpO5u7sbDodp7iJQIjIM" "o16v7+/vtzsdk2giwJgLZxqGYZqXl5eWZf04O4ui6NPeHqTCngpFRCFEr9f76jjVarXf7wsh" "hBBKqXTw41BEFETD21vbtstHR9fX10SUzWaZmZmllHNDiYiZz2q1Q8vyfV9HzGazIy9r2nxQ" "0zR1XQ+CwLKsn7WaUkoQAUwWUEqpMT8O1XWdiLrdrm3b305OBoOBEMI0zSk3M7NSWuqmf6BJ" "NwaDgeO69vFxt9dLyvdQNolSnqEUAKSU309PLcsKgkDX9dm4ETR9aIyIiFgulz8fHEgpl5eX" "ETEtYdyS+iYjBZo2HnoPZWal1IdS6fXqarVaDYKAmWlaZyYsTpQCjLfrb/rM/Gpp6WOp9G57" "u1GvO67rBwErNQP9pDlVSt2Goa7r73d3C8Vio9GoVCrtTkc9gAYAfuKLklJKKRFxZ2enUChc" "eJ7rOK12W0ppEuEYmpnlXM9UKRWGISK+3drazOc9z6tUKl6z+TuOiWj03ck4ngM6jgaAYrG4" "sbHRarVc1/WazTAMiUjTNKnUrDmdYcycqN7M59/kcu1Ox3Hd8/PzMAzjOF7867tXHUUAkMvl" "1tfXfd//cniIACqlFBZb0QBARHEc39zcrKysTHgX3FHMHEWRUmptbS3t/a9tyszxtO6/vL3/" "kP0BhtFQnDqk9wIAAAAASUVORK5CYII=") #---------------------------------------------------------------------- Play = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACTUlE" "QVRIidXWzU7bQBAH8JmxLW8SbglXLCchTsKFElEUu4aaHnhSnoInoBeEihoSwodEz5wKya67" "Oz24UAiOgQhV6p5sy/r5v7OztvHH9TW896B3F/8hats2Ir4zenNzQ0Su6y5M249PENG27YOD" "g5+3t192d33fJyKlFDMvjgIAIRrmo6Oj8/PzTqcThWGjXrcsS6WpMWZBlAFs2xZCAMDx8fFg" "MAharTAMm82mEEJK+ZrUsygiWkQAQERCCGPMt5OTwelp0Gr1+/0gCBzHUUoVp55FAcCy/178" "QzN/HwyGo1Gz0QijqB0EQogCOg8lmll3QnRdl5mHo9HZeNyo1/v9frfbFUKkaaq1fhlFotzC" "4T19Nh6PLy58z4vCsLu2VhJCPk2dl9SyCjr0gb64vLy8uvI8b2trKwiCcqn0EOVp8zMDgG1Z" "88THtBDCcZzhcLi/v//18JAeFe1J0uxBRAQAzFy8o5RSWuvV1dUkSYJWyxjzkDR/+sUxtdZK" "qVq1Gm9vf9zcrFQqUsqimiJiAWqMkVJWKpUoDOM4rtVqSqnJZDJz27OkzEgEzybOzEopIvqw" "vp4kied5Wuvn3Bw0L2maptoY3/d3k6Tb6SDidDqdN5s8NGup++OsfMvLy593dnq9XrlUki/t" "0fkoIjNPp9OlpaU4jj9FUbValVJOCgMWoUQkpXRdt7exkSTJysrKrzSdV75XoQyAiHXf39vb" "a7fbiPgmLhs484kmoru7O8dxsu576zs/P6kxplwuA0Dx+r4NzdyFuWz8Pz8TvwFpng4ClVur" "2QAAAABJRU5ErkJggg==") #---------------------------------------------------------------------- NextKeyFrame = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACNUlE" "QVRIic2Vy27aQBSGj+3xBQNRlSJlQWhwSKPUSMkQmcu+Sl8zW56AVfMCTQgLVEQSbxCELhFi" "wcUzc7qwihQ8NiTNImdny/P5/89tlNFwCO8d6rsTPyAUEXQdCAHE7VBFUXaCmqZ2d6c9PIBh" "bIEi4nK5VFVVVbeYQMMg9/fq4yNGoGRDI2Os2+0yziuVim3bnDGMuFv/P87+JhQBRs/PnU7H" "9/1Go+E4jqHrnPNYtCzIxrMCYOg6IPZ6vcFgUHbdWr1+mM8DAOf8jdC1ZELIYrH4dXv75PtV" "z6OUfs7lBOdCiFdDETFgLLQalms6nf68ufnd63med3F+nk6nhRDJaEn18eUBTdNUVR2Px61W" "q9ls9vt9xhghJKHzJDmNRpgNRHzy/eFo5LpurVr9Ui4rMW0XsQ8QZy1Er1ardrvt+75bq32f" "TD4dHES/lNgPGJNC12wAmM/nf8bj2WwmFSuvvjTC+pim+bVUopSeXl5mr6+5TMFO0DXupFSi" "lJaOj9OZDLMsBUA6ErKWWq3g31oRQnDObdt2HKdRrxcKBdu2OedBEERHPklpOJGhumwmUzo5" "oZQWj44syxJCBEGw1ZkEyjhnjNm2/e3s7ILSYrFo6LoQgiUXMBmaSqUqlHrV6mE+b1kWY2x3" "nASKiLqu/7i6yu7tWaYZ5i7pNGJ070mgmqblcrldzRICmhZ9rbz9ilZVZTIBQjCbhZdD+Irm" "3wwhcH8fECEy1v8BBYCYtf3R7v34+AuNHRpDa7trrwAAAABJRU5ErkJggg==") #---------------------------------------------------------------------- NextFrame = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACOUlE" "QVRIidWVS2/aQBSFZ8ZjYxkTFmSBRFAgpk1CJTIgE/orq/wMJFbNAjbNLqsgxAKVh+INgrhL" "HkK8PI8urCKCx01bsWju+vrTuef6noHj0Qgcu9DRie8dCiE8MlQIsdlsEEIIvT0EQkhV1WAn" "PtBIKe10OpSxYrFoGAajVAghJUIIF4vFdDqNx+OxWIxzLlcKIRQAjF9eGo1GrVYbDAaMc4yx" "1BBN03q93pe7u3a7HdG0UKUAAAiApqpAiG63OxwOP+Xzt5XKWSoFAGCMHTRzzj3P29coh+4k" "Y4zX6/VTs/nsOGXbJoQkTk85Y/sICCFCKDjHIVQI4VHqu+ivazabfXt4+N7t2rZ9UyhEo1HO" "eVDdfkm2L15/oCgKQsh13Xq9Xq1W+/0+pTTMaLlSaaPvhhDi2XFG43E+n78tlz9eXob9doHx" "AQgbzUdvt9tWq+U4TqlUAkJIuXJPpdAdGwCwWq1+uK5pmkhmgnz70vL3E4lEPlgWIaRQKDw1" "m/Tx8R+hO1zOsggh1sVF1DQxxmGbko2/3YJfscI5Z4wZhpHNZj9XKul02jAMxpjneb8JB4lS" "/9h9dTHTtHI5Qkjm/FzXdf+Egs1vQyljlFLDMK6vrm4IyWQymqpyzmlggUIIznmQC/ffKITQ" "crn8en+PFcUul89SKV3XaUhQIYQmk4nruslkMpFIvDrffagfffP5PHZyokcijLGw3NtxMcaM" "sYOsgcHXVFEU6VB/XhJPgxH3t/WuX9P/FPoTFHYunoRw1IsAAAAASUVORK5CYII=") #---------------------------------------------------------------------- LastFrame = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAAClElE" "QVRIie2VT0sbQRjG950/Gw8mW4QgCWxaMSdjwkq60YDmYD+A/QBiP5keq2IuHuKxxUNFqoI2" "UuOlInahHpYkHhLdmXmnh5VNiLFS8CL4nhZm3t/zzvMsM/D76sp47iLPTnyFvkQoABDyqAYh" "BAD+DwoA3W632WwyxiilA5u01r7vCyE454+B+iXvoZTSVru9Va1++fq10+2aphltAgAA+H5w" "sL6xcXl5yRhjjD2Eaq0HoWHzzc1NrVZbXV09OjoytOacR2iNeHp6ura2tr297ft+LBaLvOKc" "Hx4efl5fD+UNw+hpIiIhhHPued5WtXpycjI/P5+dnARChBBaa9M0AyG+7e01zs/nZmeLxWIi" "kZBSEkJarZbneRGqB9WIiAgAjDGt9c+zs18XF47jVBYWkskkIhqGQQgxTbPZatV2dn7U65VK" "JTc1xTkf8GSIO6EVpmlKKff39xuNhuu6t7e3kRWMUoNSz/M2Nzez2eyHxUWlVH9QLKIopcJx" "en4TwhjzfX93d/eNZVFK+9NgjAkh6vX63d2dlUjQvt+x96W17u9BxCAIGGMzMzPLy8uZTEZK" "Ga1KKYUQ4+PjH5eWPq2sJJNJqdSQ4yOi1toAQEQp5cjISCGfL5VK7yYmCMDx8XEoHKLTqZTr" "uvl83rIsxphSKgiCYVCtpZQiCOLxuOM4ruu+zWQopUqpQIhwNM65bdvvi8VcLmdZllQqCAJE" "TKVS07ncEKhSKmaaJdedK5cztg0AIQgAtNaolG3b5XI5Pz09OjoqhIhGk1IWCgXHcYQQ9wmF" "zwkhpN1udzqddDodhjbg75/r67GxsUQ8LqUcyPNhQfRGEUIIIQO43okYQ8QncQ88/WdPf/RP" "1ku8pF+hz1V/AVdHWFTfbzsRAAAAAElFTkSuQmCC") #---------------------------------------------------------------------- Key = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAACl0lE" "QVRIie2Uv0sbYRjH3x+X9/JGk9wlYkg6icbJMf0LHCxo/QuKUCfR0TFqB/dKHSztYKHBYHCp" "kIIFqZM6ODho3Y2tQ44EMRffu3tz79vhlcNGC5I4+h2/L3yen+8Df19cgKcWenLiM7RbKITw" "vql1g6OUAikhQowxIUTw1GGmEEKdkEKh8GZq6v3KCgAAY9wttKen58Pqan5hwTCMcrm8sLhI" "COkKSgg5Ozv79PlzcWPjy/r6j50du9HY3d2llHYO1XV9s1R6NTY2OjpqWRbGeG5u7uDwMGjr" "LRRCiB4tz/N+nZ6OT0y4rgsAcBwnm82GNK1WqyGEQDB9IYTv+wAAhBDGmHOuaZqUUpl3hRBq" "NBp2szk0OOh5HgBASkkpTSSTVcsyTVMIoakeHR8fb5ZKGsYN2242m5l0ulqtYozNROLurqia" "GGPX19eGYUgplSmljEQiruOotdUAAJzz4eHh+fl5Sun3cvnn3t7y8nI+n0/29c3MzDRtuz1T" "256dnXUcJxKJBJG45yGEVBhNxSGE6LpOKTUMIxqNJpPJWCwWi8USpklCoTZoPB4nhPy5vOzv" "71f98X2/Vq8bhqHKQkH+QgghBOfccRwhhOu6nucFfiDf9ymlqVTqYH8/HA4DADDGlmVdXV2l" "Uql/oEq+72cymZe5HGNsZGQkOzTEOW8blCpwYnz8a6FQr9ej0ahpmltbWy8ymd7eXvUK2y4/" "xhhj7LouIURKyTm/fzIQQhDC15OTmqa9W1o6Ojr6tr1dLBaNeLzVaj0AfaR0Xa9UKm+np09O" "TgYGBj6ureVyOcbY7dw6g0opw+Fw8+amcn6eTqdN02SMBTV1CFVCCIVCoVar1fZHOr+nAAC1" "JA8E6wb6Pz1Dn15/AQsQSZkYzgBNAAAAAElFTkSuQmCC") #---------------------------------------------------------------------- Stop = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAAAvklE" "QVRIie3VMQ6DMAwF0G9CEUxMzAwch4NwCEbuxyXoygiBkMQd2KoUM7Cg4tFSnixZ/qH3MODq" "ii4XHzQO9IiQpvJTIlgLY06gRFgW3/dwDkRHqHMoiqiq4L2ExjGPo+k6TBOUOkK1VnUdtS2M" "AfMhug+bZfBeQAEkSbB9n+0/6IPeAQ2dKTO0htbi7QcjKoQ6hzx/NQ22TUgpa6ksYe1XmgCg" "wMe3B4pYe56u64lJATBjnmX0d91n+3+OfgDGM0GplgNFhQAAAABJRU5ErkJggg==") #---------------------------------------------------------------------- DeleteKey = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAAA3NCSVQICAjb4U/gAAAEXUlE" "QVRIibWWX0hUWRzHf+ece4/3TjPjvTMOrqM+lH9KmQhEszCC2OifLRRF+LKwb8X66Eug0UOP" "Cz22+7JIGwxmEGmTWUahkhapLQSbwQZFm6iDOubM3DPn3nvOPozT6jhKQft7u/f+zuf3O7/v" "+f3ORf98+ADf2vA3JxaC4q8Mg9DGJeufpUSWBYryxSlhcBy0spLHXQ9VFOXxY/z2LWjal+Qo" "CaGxGI7HgZDNoQDOwYPqyAianQVV3ZopNY0+eCBDIXfXLrDtzaGuK02THztGYzFIp/PiryPq" "Oh0f34ax0tq6jRC81fYBgHNRWens30/v3AEorJvUNPXNG/39+98TiR/b2q5evQoAZE0GBdYg" "xpxIRFRV0f5+qaqA0LrPqorn5oqnpn55966zq8vw+WL37nVdukQp3QoKAMiy7JYW6fHQoSG5" "VjRCgDHfw4d/VlT81tMTvX69u7v7weBgcmXl0aNHuq5vBc3my48eRcvLyvPnMuuNEGBM+/pw" "S0t0bOz4oUPfHz4cj8cJIe3t7WPj40KIdVCEEM4zhLAQzqlT6vS0Oj0Nug6aVjQ4iCoqUvX1" "f01Otp48mclkAIAxVlNToyrKwsJCVrFVqBCCc845dxxHSsk5F0II2+aOk2xtxcPD7uwsfvbM" "tizrwIHEx4/JVKq6qopzDgBSSk3TAsHgfDyelUsBAErpy5cve27eVAhZSSZTqVS4rGx+fp4Q" "YgYCLsZFyeQPg4NzlD7dvh2mpqx0+tOnT4ZhSClXz4OUHo8nwxhCaBVq23ZtbW1HR4eu6/di" "scdPnly5cqWzszNYUnLh/Pkk57C0FIhGeSjUdOYMwXhlefnn9nbGmMfj+Vw9m3OMcTYMzsah" "lAZMM2CahmH4fL5gMOj3+/1+fyAUCup6eHQULlzQmpu/GxkxQqGKykpK6ceZGSU3JVzXXVhc" "NAwjqxX+nL8Q2TLajDEhRCaT4bYtAZTbtzMNDSIUshsaXK8XDwxohlFaWjr29KmmaQBACInH" "44lEorS0dB30c8BwONzU2GhZViQSqY5E0N27orzc2bMHGEOM8SNHUCqljI+3nj37x40bi4uL" "Pp/PNM1bt26Vh8Nerze7fZQ3+QkhhJBMJkOLi8noqDszw0+fRozlegUDgNbbK5qaTly8qNj2" "5cuXX7x4caevLxqNGsXFjuMUgK5Wo6hIef1amZxkbW1ICMipvNpUluXv6/u7vv6nrq5XExPb" "d+z49dq1xsZGy7JWdSsAVVU0N0cHBjLnzoGug+sWcJif9w4NJU6ceL+0VFZSYpqmZVkoNyU2" "tCkhkE7T+/f58ePS6y1ABADbFmVlqX37vAMDddXVXr+f5U5oIShCAED7+53mZlFejjgvQMw6" "Mubu3GnX1cneXjfX8ptAVVUdHhaVlc7u3f+JsxnXsuy9e2VJiTIxAWvmHuTXFCG0vCwNAzYE" "39QwRum01PW1Yubfpl9HBAAh8ogboABfR8ylkvfif/lD+Rcv7QbV/D7nwgAAAABJRU5ErkJg" "gg==") class TimeSlider(wx.Window): """ This is the Time Slider Panel. """ def __init__(self, parent, slidersize, sliderStartFrame, sliderEndFrame, curFrame): wx.Window.__init__(self, parent, size = slidersize, style = wx.SUNKEN_BORDER) self._mainDialog = wx.GetTopLevelParent(self) self._mouseIn = False self.points = [] self.numbers = [] self.curFrame = curFrame self.sliderStartFrame = sliderStartFrame self.sliderEndFrame = sliderEndFrame self.frameNum = self.sliderEndFrame-self.sliderStartFrame+1 self.InitBuffer() self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMotion) def InitBuffer(self): self.w,self.h = self.GetClientSize() self.buffer = wx.EmptyBitmap(self.w, self.h) dc = wx.BufferedDC(wx.ClientDC(self), self.buffer) self.DrawTimeSlider(dc) self.DrawNumber(dc) self.DrawFrame(dc) self.DrawKeys(dc) def SetTimeSliderData(self, sliderStartFrame = 1, sliderEndFrame = 24, curFrame = 0): self.curFrame = curFrame self.sliderStartFrame = sliderStartFrame self.sliderEndFrame = sliderEndFrame self.frameNum = self.sliderEndFrame-self.sliderStartFrame+1 self.points = [] self.numbers = [] self.InitBuffer() self.Refresh() def OnPaint(self, evt): dc = wx.BufferedPaintDC(self, self.buffer) def DrawTimeSlider(self,dc): dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.BLACK_BRUSH) dc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)) self.unitWidth = self.w/float(self.frameNum) if self.frameNum <= 20: self.points.append(((float(0),self.h),(float(0),self.h-15))) for i in range(1,self.frameNum): temp = self.points[i-1][0][0]+self.unitWidth self.points.append(((temp,self.h),(temp,self.h-15))) for i in range(self.frameNum): self.numbers.append(self.sliderStartFrame+i) for i in range(self.frameNum): dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1]) st = str(self.numbers[i]) tw,th = dc.GetTextExtent(st) dc.DrawText(st, self.points[i][0][0]+2, 0.5) elif self.frameNum <= 70: self.points.append(((self.unitWidth,self.h),(self.unitWidth,self.h-15))) for i in range(1,int((self.frameNum+1)/2)): temp = self.points[i-1][0][0]+2*self.unitWidth self.points.append(((temp,self.h),(temp,self.h-15))) for i in range(1,self.frameNum/2+1): self.numbers.append(self.sliderStartFrame-1+i*2) for i in range(int((self.frameNum+1)/2)): dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1]) for i in range(self.frameNum/2): st = str(self.numbers[i]) tw,th = dc.GetTextExtent(st) dc.DrawText(st, self.points[i][0][0]+2, 0.5) elif self.frameNum <= 150: self.points.append(((self.unitWidth*4.0,self.h),(self.unitWidth*4.0,self.h-15))) for i in range(1,int(self.frameNum/5)): temp = self.points[i-1][0][0]+5*self.unitWidth self.points.append(((temp,self.h),(temp,self.h-15))) for i in range(1,self.frameNum/5+1): self.numbers.append(self.sliderStartFrame-1+i*5) for i in range(int(self.frameNum/5)): dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1]) for i in range(self.frameNum/5): st = str(self.numbers[i]) tw,th = dc.GetTextExtent(st) dc.DrawText(st, self.points[i][0][0]+2, 0.5) elif self.frameNum <= 250: self.points.append(((self.unitWidth*9.0,self.h),(self.unitWidth*9.0,self.h-15))) for i in range(1,int(self.frameNum/10)): temp = self.points[i-1][0][0]+10*self.unitWidth self.points.append(((temp,self.h),(temp,self.h-15))) for i in range(1,self.frameNum/10+1): self.numbers.append(self.sliderStartFrame+i*10) for i in range(int(self.frameNum/10)): dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1]) for i in range(self.frameNum/10): st = str(self.numbers[i]) tw,th = dc.GetTextExtent(st) dc.DrawText(st, self.points[i][0][0]+2, 0.5) elif self.frameNum <= 1000: self.points.append(((self.unitWidth*49.0,self.h),(self.unitWidth*49.0,self.h-15))) for i in range(1,int(self.frameNum/50)): temp = self.points[i-1][0][0]+50*self.unitWidth self.points.append(((temp,self.h),(temp,self.h-15))) for i in range(1,self.frameNum/50+1): self.numbers.append(self.sliderStartFrame-1+i*50) for i in range(int(self.frameNum/50)): dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1]) for i in range(self.frameNum/50): st = str(self.numbers[i]) tw,th = dc.GetTextExtent(st) dc.DrawText(st, self.points[i][0][0]+2, 0.5) elif self.frameNum <= 2000: self.points.append(((self.unitWidth*99.0,self.h),(self.unitWidth*99.0,self.h-15))) for i in range(1,int(self.frameNum/100)): temp = self.points[i-1][0][0]+100*self.unitWidth self.points.append(((temp,self.h),(temp,self.h-15))) for i in range(1,self.frameNum/100+1): self.numbers.append(self.sliderStartFrame-1+i*100) for i in range(int(self.frameNum/100)): dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1]) for i in range(self.frameNum/100): st = str(self.numbers[i]) tw,th = dc.GetTextExtent(st) dc.DrawText(st, self.points[i][0][0]+2, 0.5) elif self.frameNum <= 10000: self.points.append(((self.unitWidth*999.0,self.h),(self.unitWidth*999.0,self.h-15))) for i in range(1,int(self.frameNum/1000)): temp = self.points[i-1][0][0]+1000*self.unitWidth self.points.append(((temp,self.h),(temp,self.h-15))) for i in range(1,self.frameNum/1000+1): self.numbers.append(self.sliderStartFrame-1+i*1000) for i in range(int(self.frameNum/1000)): dc.DrawLine(self.points[i][0][0], self.points[i][0][1], self.points[i][1][0], self.points[i][1][1]) for i in range(self.frameNum/1000): st = str(self.numbers[i]) tw,th = dc.GetTextExtent(st) dc.DrawText(st, self.points[i][0][0]+2, 0.5) else: pass def DrawNumber(self, dc): dc.SetPen(wx.BLACK_PEN) dc.SetBrush(wx.BLACK_BRUSH) dc.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)) i = self.curFrame-self.sliderStartFrame st = str(self.curFrame) tw,th = dc.GetTextExtent(st) dc.DrawText(st, float(self.unitWidth)*float(i)+2, self.h-th-0.5) def DrawFrame(self, dc): i = self.curFrame-self.sliderStartFrame pos = float(self.unitWidth)*float(i) self.curRect = wx.Rect(pos, float(0), self.unitWidth, self.h) oldPen, oldBrush, oldMode = dc.GetPen(), dc.GetBrush(), dc.GetLogicalFunction() gray = wx.Colour(200, 200, 200) grayPen = wx.Pen(gray) grayBrush = wx.Brush(gray) dc.SetPen(grayPen) dc.SetBrush(grayBrush) dc.SetLogicalFunction(wx.XOR) dc.DrawRectangleRect(self.curRect) dc.SetPen(oldPen) dc.SetBrush(oldBrush) dc.SetLogicalFunction(oldMode) def DrawKeys(self, dc): if len(self._mainDialog.keys) != 0: for key in self._mainDialog.keys: keyFrame = key i = keyFrame-self.sliderStartFrame pos = float(self.unitWidth)*float(i) oldPen, oldBrush, oldMode = dc.GetPen(), dc.GetBrush(), dc.GetLogicalFunction() dc.SetPen(wx.Pen("red")) dc.SetBrush(wx.Brush("red")) dc.SetLogicalFunction(wx.AND) dc.DrawLine(pos, float(0), pos, self.h) dc.SetPen(oldPen) dc.SetBrush(oldBrush) dc.SetLogicalFunction(oldMode) else: pass def OnSize(self,evt): self.InitBuffer() def OnLeftDown(self,evt): point = (evt.GetX(), evt.GetY()) if point[1]>= float(0) and point[1]<= (float(self.h)-2.0): if point[0]>= float(0) and point[0]<= float(self.w): self._mouseIn = True if self._mouseIn: self.CaptureMouse() self.curFrame = int(float(point[0])/self.unitWidth)+self.sliderStartFrame self._mainDialog.curFrame = self.curFrame self._mainDialog.curFrameSpin.SetValue(self.curFrame) self._mainDialog.OnAnimation(self.curFrame) self.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame) def OnLeftUp(self,evt): if self.GetCapture(): self.ReleaseMouse() self._mouseIn = False def OnMotion(self,evt): self._mouseIn = False if evt.Dragging() and evt.LeftIsDown(): point = (evt.GetX(), evt.GetY()) if point[1]>= float(0) and point[1]<= (float(self.h)-2.0): if point[0]>= float(0) and point[0]<= float(self.w): self._mouseIn = True if self._mouseIn: self.curFrame = int(float(point[0])/self.unitWidth)+self.sliderStartFrame self._mainDialog.curFrame = self.curFrame self._mainDialog.curFrameSpin.SetValue(self.curFrame) self._mainDialog.OnAnimation(self.curFrame) self.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame) evt.Skip() self._mouseIn = False class TimeRange(wx.Window): """ This is the Time Range Panel. """ def __init__(self, parent, rangesize, startFrame, endFrame, sliderStartFrame, sliderEndFrame): wx.Window.__init__(self, parent, size = rangesize, style = wx.SUNKEN_BORDER) self._mainDialog = wx.GetTopLevelParent(self) self._mouseIn = False self.startFrame = startFrame self.endFrame = endFrame self.sliderStartFrame = sliderStartFrame self.sliderEndFrame = sliderEndFrame self.frameNum = self.endFrame-self.startFrame+1 self.InitBuffer() self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMotion) def InitBuffer(self): self.w,self.h = self.GetClientSize() self.buffer = wx.EmptyBitmap(self.w, self.h) dc = wx.BufferedDC(wx.ClientDC(self), self.buffer) self.DrawTimeRange(dc) def SetTimeRangeData(self, startFrame = 1, endFrame = 24, sliderStartFrame = 1, sliderEndFrame = 24): self.startFrame = startFrame self.endFrame = endFrame self.sliderStartFrame = sliderStartFrame self.sliderEndFrame = sliderEndFrame self.frameNum = self.endFrame-self.startFrame+1 self.InitBuffer() self.Refresh() def OnPaint(self, evt): dc = wx.BufferedPaintDC(self, self.buffer) def DrawTimeRange(self,dc): dc.SetBackground(wx.Brush(wx.Colour(150, 150, 150))) dc.Clear() dc.SetPen(wx.Pen(self.GetBackgroundColour())) dc.SetBrush(wx.Brush(self.GetBackgroundColour())) self.unitWidth = (self.w-6.0)/float(self.frameNum) self.rangePosX = 3.0+(float(self.sliderStartFrame-self.startFrame))*self.unitWidth self.rangePosY = 2.0 self.rangeWidth = float(self.sliderEndFrame-self.sliderStartFrame+1)*self.unitWidth self.rangeHeight = self.h-4.0 self.curRect = wx.Rect(self.rangePosX, self.rangePosY, self.rangeWidth, self.rangeHeight) dc.DrawRoundedRectangleRect(self.curRect, radius = 2) def OnSize(self,evt): self.InitBuffer() def OnLeftDown(self,evt): point = (evt.GetX(), evt.GetY()) self.pos = 0 if point[1]>= self.rangePosY and point[1]<= self.rangePosY+self.rangeHeight: if point[0]>= self.rangePosX and point[0]<= self.rangePosX+self.rangeWidth: self._mouseIn = True if self._mouseIn: self.CaptureMouse() self.pos = point def OnLeftUp(self,evt): if self.GetCapture(): self.ReleaseMouse() self._mouseIn = False def OnMotion(self,evt): self._mouseIn = False if evt.Dragging() and evt.LeftIsDown(): newPos = (evt.GetX(), evt.GetY()) if newPos[1]>= self.rangePosY and newPos[1]<= self.rangePosY+self.rangeHeight: if newPos[0]>= self.rangePosX and newPos[0]<= self.rangePosX+self.rangeWidth: self._mouseIn = True if self._mouseIn: if newPos[0] == self.pos[0]: evt.Skip() self._mouseIn = False if newPos[0] > self.pos[0]: if float(newPos[0]-self.pos[0]) >= self.unitWidth: if self.sliderEndFrame < self.endFrame: self.sliderStartFrame += 1 self.sliderEndFrame += 1 self.SetTimeRangeData(self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame) self.MainPanelUpdate() self.pos = newPos evt.Skip() self._mouseIn = False if newPos[0] < self.pos[0]: if float(self.pos[0]-newPos[0]) >= self.unitWidth: if self.sliderStartFrame > self.startFrame: self.sliderStartFrame -=1 self.sliderEndFrame -=1 self.SetTimeRangeData(self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame) self.MainPanelUpdate() self.pos = newPos evt.Skip() self._mouseIn = False evt.Skip() self._mouseIn = False def MainPanelUpdate(self): self._mainDialog.sliderStartFrame = self.sliderStartFrame self._mainDialog.sliderEndFrame = self.sliderEndFrame self._mainDialog.timeSliderStartSpin.SetValue(self.sliderStartFrame) self._mainDialog.timeSliderEndSpin.SetValue(self.sliderEndFrame) self._mainDialog.timeSlider.SetTimeSliderData(self._mainDialog.sliderStartFrame, self._mainDialog.sliderEndFrame, self._mainDialog.curFrame) class AnimControlUI(wx.Dialog): """ This is the Animation Control main class implementation. """ def __init__(self, parent, editor): wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Animation Controller", pos=wx.DefaultPosition, size=(920, 110)) self.editor = editor self._initOver = False self.parallel = [] if self.editor.animMgr.keyFramesInfo != []: self.editor.animMgr.generateKeyFrames() self.keys = self.editor.animMgr.keyFrames self.editor.objectMgr.findActors(render) self.editor.objectMgr.findNodes(render) self.prePlay = False self.play = False self.stop = True self.curFrame = 1 self.startFrame = 1 self.sliderStartFrame = 1 self.endFrame = 24 self.sliderEndFrame = 24 self.mainPanel1 = wx.Panel(self, -1) self.timeSlider = TimeSlider(self.mainPanel1, wx.Size(560, 35), self.sliderStartFrame, self.sliderEndFrame, self.curFrame) self.curFrameSpin = wx.SpinCtrl(self.mainPanel1, -1, "",size = (70,25),min=self.startFrame, max=self.endFrame) bmpFirstFrame = FirstFrame.GetBitmap() bmpPreFrame = PreFrame.GetBitmap() bmpPreKeyFrame = PreKeyFrame.GetBitmap() self.bmpPrePlay = PrePlay.GetBitmap() self.bmpPlay = Play.GetBitmap() bmpNextKeyFrame = NextKeyFrame.GetBitmap() bmpNextFrame = NextFrame.GetBitmap() bmpLastFrame = LastFrame.GetBitmap() bmpKey = Key.GetBitmap() self.bmpStop = Stop.GetBitmap() bmpDeleteKey = DeleteKey.GetBitmap() self.buttonFirstFrame = wx.BitmapButton(self.mainPanel1, -1, bmpFirstFrame, size = (30,30),style = wx.BU_AUTODRAW) self.buttonPreFrame = wx.BitmapButton(self.mainPanel1, -1, bmpPreFrame, size = (30,30),style = wx.BU_AUTODRAW) self.buttonPreKeyFrame = wx.BitmapButton(self.mainPanel1, -1, bmpPreKeyFrame, size = (30,30),style = wx.BU_AUTODRAW) self.buttonPrePlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPrePlay, size = (30,30),style = wx.BU_AUTODRAW) self.buttonPlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPlay, size = (30,30),style = wx.BU_AUTODRAW) self.buttonNextKeyFrame = wx.BitmapButton(self.mainPanel1, -1, bmpNextKeyFrame, size = (30,30),style = wx.BU_AUTODRAW) self.buttonNextFrame = wx.BitmapButton(self.mainPanel1, -1, bmpNextFrame, size = (30,30),style = wx.BU_AUTODRAW) self.buttonLastFrame = wx.BitmapButton(self.mainPanel1, -1, bmpLastFrame, size = (30,30),style = wx.BU_AUTODRAW) self.mainPanel2 = wx.Panel(self, -1) self.timeStartSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=0, max=self.sliderEndFrame) self.timeSliderStartSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=self.startFrame, max=self.sliderEndFrame) self.timeRange = TimeRange(self.mainPanel2, wx.Size(450, 25), self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame) self.timeSliderEndSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=self.sliderStartFrame, max=self.endFrame) self.timeEndSpin = wx.SpinCtrl(self.mainPanel2, -1, "",size = (70,25),min=self.sliderStartFrame, max=10000) self.buttonDeleteKey = wx.BitmapButton(self.mainPanel2, -1, bmpDeleteKey, size = (30,30),style = wx.BU_AUTODRAW) self.SetProperties() self.DoLayout() self.Bind(wx.EVT_SPINCTRL, self.OnCurrentTime, self.curFrameSpin) self.Bind(wx.EVT_BUTTON, self.OnFirstFrame, self.buttonFirstFrame) self.Bind(wx.EVT_BUTTON, self.OnPreFrame, self.buttonPreFrame) self.Bind(wx.EVT_BUTTON, self.OnPreKeyFrame, self.buttonPreKeyFrame) self.Bind(wx.EVT_BUTTON, self.OnPrePlay, self.buttonPrePlay) self.Bind(wx.EVT_BUTTON, self.OnPlay, self.buttonPlay) self.Bind(wx.EVT_BUTTON, self.OnNextKeyFrame, self.buttonNextKeyFrame) self.Bind(wx.EVT_BUTTON, self.OnNextFrame, self.buttonNextFrame) self.Bind(wx.EVT_BUTTON, self.OnLastFrame, self.buttonLastFrame) self.Bind(wx.EVT_SPINCTRL, self.OnTimeStartSpin, self.timeStartSpin) self.Bind(wx.EVT_SPINCTRL, self.OnTimeSliderStartSpin, self.timeSliderStartSpin) self.Bind(wx.EVT_SPINCTRL, self.OnTimeSliderEndSpin, self.timeSliderEndSpin) self.Bind(wx.EVT_SPINCTRL, self.OnTimeEndSpin, self.timeEndSpin) self.Bind(wx.EVT_BUTTON, self.OnDeleteKey, self.buttonDeleteKey) self.Bind(wx.EVT_CLOSE, self.OnExit) self.OnPropKey() self.OnAnimation(self.curFrame) self.timeUnit = float(1)/float(24)*float(1000) self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) self._initOver = True def SetProperties(self): self.curFrameSpin.SetValue(self.curFrame) self.timeStartSpin.SetValue(self.startFrame) self.timeSliderStartSpin.SetValue(self.sliderStartFrame) self.timeSliderEndSpin.SetValue(self.sliderEndFrame) self.timeEndSpin.SetValue(self.endFrame) def DoLayout(self): dialogSizer = wx.BoxSizer(wx.VERTICAL) mainSizer1 = wx.FlexGridSizer(1, 10, 0, 0) mainSizer2 = wx.FlexGridSizer(1, 6, 0, 0) mainSizer1.Add(self.timeSlider, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5) mainSizer1.Add(self.curFrameSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 3) mainSizer1.Add(self.buttonFirstFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 3) mainSizer1.Add(self.buttonPreFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3) mainSizer1.Add(self.buttonPreKeyFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3) mainSizer1.Add(self.buttonPrePlay, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3) mainSizer1.Add(self.buttonPlay, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3) mainSizer1.Add(self.buttonNextKeyFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3) mainSizer1.Add(self.buttonNextFrame, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3) mainSizer1.Add(self.buttonLastFrame, 0, wx.ALIGN_CENTER_VERTICAL) mainSizer2.Add(self.timeStartSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5) mainSizer2.Add(self.timeSliderStartSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5) mainSizer2.Add(self.timeRange, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5) mainSizer2.Add(self.timeSliderEndSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5) mainSizer2.Add(self.timeEndSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5) mainSizer2.Add(self.buttonDeleteKey, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 3) self.mainPanel1.SetSizerAndFit(mainSizer1) self.mainPanel2.SetSizerAndFit(mainSizer2) dialogSizer.Add(self.mainPanel1, 1, wx.ALIGN_CENTER_VERTICAL|wx.TOP, 5) dialogSizer.Add(self.mainPanel2, 1, wx.ALIGN_CENTER_VERTICAL|wx.TOP, 7) self.SetSizer(dialogSizer) self.Layout() self.dialogSizer = dialogSizer def OnCurrentTime(self, evt): self.curFrame = evt.GetInt() self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame) self.OnAnimation(self.curFrame) def OnControl(self): self.curFrameSpin.SetValue(self.curFrame) self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame) self.OnAnimation(self.curFrame) def OnFirstFrame(self,evt): self.curFrame = self.sliderStartFrame self.OnControl() def OnPreFrame(self,evt): if self.curFrame-1 >= self.startFrame: self.curFrame -= 1 self.OnControl() else: evt.Skip() def sortKey(self): for i in range(0, len(self.keys)-1): for j in range(i+1, len(self.keys)): if self.keys[i]>self.keys[j]: temp = self.keys[i] self.keys[i] = self.keys[j] self.keys[j] = temp def OnPreKeyFrame(self,evt): self.sortKey() if self.curFrame <= self.keys[0] or self.curFrame > self.keys[len(self.keys)-1]: self.curFrame = self.keys[len(self.keys)-1] else: for i in range(1, len(self.keys)): if self.curFrame <= self.keys[i] and self.curFrame > self.keys[i-1]: self.curFrame = self.keys[i-1] break self.OnControl() def OnTimer(self,evt): if self.prePlay == True and self.stop == False and self.play == False: if self.curFrame-1>=self.sliderStartFrame: self.curFrame -= 1 self.OnControl() elif self.curFrame == self.sliderStartFrame: self.curFrame = self.sliderEndFrame self.OnControl() if self.play == True and self.stop == False and self.prePlay == False: if self.curFrame+1<=self.sliderEndFrame: self.curFrame += 1 self.OnControl() elif self.curFrame == self.sliderEndFrame: self.curFrame = self.sliderStartFrame self.OnControl() def OnPrePlay(self,evt): if self.prePlay == False and self.stop == True and self.play == False: self.buttonPrePlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpStop, size = (30,30),style = wx.BU_AUTODRAW) self.DoLayout() self.prePlay = True self.stop = False self.timer.Start(self.timeUnit) evt.Skip() elif self.prePlay == True and self.stop == False and self.play == False: self.buttonPrePlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPrePlay, size = (30,30),style = wx.BU_AUTODRAW) self.DoLayout() self.prePlay = False self.stop = True self.timer.Stop() evt.Skip() else: evt.Skip() def OnPlay(self,evt): if self.play == False and self.stop == True and self.prePlay == False: self.buttonPlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpStop, size = (30,30),style = wx.BU_AUTODRAW) self.DoLayout() self.play = True self.stop = False self.timer.Start(self.timeUnit) evt.Skip() elif self.play == True and self.stop == False and self.prePlay == False: self.buttonPlay = wx.BitmapButton(self.mainPanel1, -1, self.bmpPlay, size = (30,30),style = wx.BU_AUTODRAW) self.DoLayout() self.play = False self.stop = True self.timer.Stop() evt.Skip() else: evt.Skip() def OnNextKeyFrame(self,evt): self.sortKey() if self.curFrame < self.keys[0] or self.curFrame >= self.keys[len(self.keys)-1]: self.curFrame = self.keys[0] else: for i in range(0, len(self.keys)-1): if self.curFrame >= self.keys[i] and self.curFrame < self.keys[i+1]: self.curFrame = self.keys[i+1] break self.OnControl() def OnNextFrame(self,evt): if self.curFrame+1 <= self.endFrame: self.curFrame += 1 self.OnControl() else: evt.Skip() def OnLastFrame(self,evt): self.curFrame = self.sliderEndFrame self.OnControl() def OnTime(self): preFrame = self.curFrame self.curFrameSpin.SetRange(self.startFrame,self.endFrame) self.curFrame = preFrame self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame) self.timeRange.SetTimeRangeData(self.startFrame, self.endFrame, self.sliderStartFrame, self.sliderEndFrame) self.parallel = self.editor.animMgr.createParallel(self.startFrame,self.endFrame) def OnTimeStartSpin(self,evt): self.startFrame = evt.GetInt() self.timeSliderStartSpin.SetRange(self.startFrame, self.sliderEndFrame) if self.startFrame >= self.sliderStartFrame: self.sliderStartFrame = self.startFrame self.timeSliderStartSpin.SetValue(self.sliderStartFrame) self.OnTime() else: self.OnTime() def OnTimeSliderStartSpin(self,evt): self.sliderStartFrame = evt.GetInt() self.timeEndSpin.SetRange(self.sliderStartFrame, 10000) self.OnTime() def OnTimeSliderEndSpin(self,evt): self.sliderEndFrame = evt.GetInt() self.timeStartSpin.SetRange(0, self.sliderEndFrame) self.OnTime() def OnTimeEndSpin(self,evt): self.endFrame = evt.GetInt() self.timeSliderEndSpin.SetRange(self.sliderStartFrame, self.endFrame) if self.endFrame <= self.sliderEndFrame: self.sliderEndFrame = self.endFrame self.timeSliderEndSpin.SetValue(self.sliderEndFrame) self.OnTime() else: self.OnTime() def OnDeleteKey(self,evt): for i in range(0,len(self.keys)): if self.curFrame == self.keys[i]: del self.keys[i] break for j in self.editor.animMgr.keyFramesInfo.keys(): for k in range(0,len(self.editor.animMgr.keyFramesInfo[j])): if self.curFrame == self.editor.animMgr.keyFramesInfo[j][k][0]: del self.editor.animMgr.keyFramesInfo[j][k] break for l in self.editor.animMgr.keyFramesInfo.keys(): if len(self.editor.animMgr.keyFramesInfo[l]) == 0: del self.editor.animMgr.keyFramesInfo[l] self.OnPropKey() self.OnAnimation(self.curFrame) def OnPropKey(self): self.parallel = self.editor.animMgr.createParallel(self.startFrame, self.endFrame) self.timeSlider.SetTimeSliderData(self.sliderStartFrame, self.sliderEndFrame, self.curFrame) def OnAnimation(self, curFrame): time = float(curFrame-1)/float(24) self.parallel.setT(time) if self.editor.GRAPH_EDITOR == True: self.editor.ui.graphEditorUI.curFrameChange() def OnExit(self,evt): for actor in self.editor.objectMgr.Actor: actorAnim = os.path.basename(actor[OG.OBJ_ANIM]) actor[OG.OBJ_NP].loop(actorAnim) self.parallel = None self.Destroy() self.editor.ui.editAnimMenuItem.Check(False) self.editor.mode = self.editor.BASE_MODE