Advertisement
aviosipov

Arduino Blender Cotrnol

Apr 12th, 2014
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.90 KB | None | 0 0
  1. import sys
  2. import struct
  3. import bpy
  4. from time import sleep
  5. sys.path.append("C:\Python33\Lib\site-packages")
  6. import serial
  7. import os
  8. import threading
  9. import math
  10. from random import randint
  11.  
  12. prev_base = 0  
  13. prev_neck = 0
  14. prev_twist = 0
  15. prev_mouth = 0
  16. prev_r_brow = 0
  17. prev_l_brow = 0
  18.  
  19.  
  20. is_serial_free = 1  
  21. serial_counter = 0
  22.  
  23.      
  24.  
  25. def sendSerialCommand(a):
  26.    
  27.     global is_serial_free  
  28.     global serial_counter
  29.    
  30.     if is_serial_free == 1 :        
  31.        
  32.         is_serial_free = 0  
  33.         serialport.write(bytes(a,encoding='ascii'))    
  34.         serial_counter = serial_counter+1
  35.                
  36.         print(a)
  37.         print(serial_counter )
  38.         is_serial_free = 1
  39.        
  40.  
  41.  
  42. def getAngle(object,axis):
  43.  
  44.     rotation = bpy.data.objects[object].rotation_euler
  45.     rot = round( rotation[axis] * (180/math.pi) ,0)      
  46.     rot += 90 # fix 0 based rotations
  47.     rot = int(rot)
  48.     return rot
  49.    
  50.    
  51.  
  52. def updateFunc():
  53.    
  54.     global prev_base
  55.     global prev_neck
  56.     global prev_twist
  57.     global prev_mouth
  58.     global prev_l_brow
  59.     global prev_r_brow
  60.    
  61.  
  62.    
  63.        
  64.    
  65.     # set base rotation
  66.    
  67.     rot = getAngle("base",2) ;
  68.     rot -= 0
  69.        
  70.     if  prev_base != rot:
  71.         prev_base = rot
  72.         sendSerialCommand("a%d\n" % rot)            
  73.    
  74.     # set neck rotation    
  75.  
  76.     rot = getAngle("neck",1) ;
  77.     rot -= 90        
  78.     if  prev_neck != rot :
  79.         prev_neck = rot
  80.         sendSerialCommand("b%d\n" % rot)        
  81.    
  82.    
  83.    
  84.     rot = getAngle("twist",1)
  85.     rot -= 0    
  86.     if  prev_twist != rot:
  87.         prev_twist = rot  
  88.         sendSerialCommand("c%d\n" % rot)            
  89.    
  90.     # set mouth rotation
  91.    
  92.     rot = getAngle("mouth",0) ;
  93.     if  prev_mouth != rot:
  94.         prev_mouth = rot        
  95.         sendSerialCommand("d%d\n" % rot)            
  96.  
  97.  
  98.        
  99.     # set l.brow rotation
  100.    
  101.     rot = getAngle("left_brow",1)
  102.     rot-=90
  103.     if  prev_l_brow != rot:
  104.         prev_l_brow = rot        
  105.         sendSerialCommand("f%d\n" % rot)            
  106.  
  107.     # set r.brow rotation
  108.    
  109.     rot = getAngle("right_brow",1)
  110.     rot-=90
  111.     if  prev_r_brow != rot:
  112.         prev_r_brow = rot        
  113.         sendSerialCommand("e%d\n" % rot)  
  114.            
  115.  
  116.  
  117.  
  118. def scene_update(context):    
  119.    
  120.     if bpy.data.objects.is_updated:
  121.        
  122.         updateFunc()
  123.      
  124.      #   t1 = threading.Thread(target=threadFunc)
  125.     #    t1.start()
  126.     #    t1.join()            
  127.  
  128.        
  129.  
  130.  
  131.  
  132.  
  133.  
  134. # we're ready to go !
  135.  
  136. clear = lambda: os.system('cls')
  137. clear()
  138.  
  139.  
  140.  
  141.  
  142. serialport = serial.Serial('COM3', 57600)
  143. #serialport = None
  144.  
  145. bpy.app.handlers.scene_update_post.clear()
  146. bpy.app.handlers.scene_update_post.append(scene_update)
  147. sleep(3)    
  148.  
  149.  
  150.  
  151.  
  152. #################################################################
  153. #### menu stuff goes here #######################################
  154. #################################################################
  155.  
  156.  
  157. # create custom menu in tools panel
  158. # for com port management
  159.  
  160. class ToolsPanel(bpy.types.Panel):
  161.    
  162.     bl_label = "Com Manager"
  163.     bl_space_type = "VIEW_3D"
  164.     bl_region_type = "TOOLS"
  165.    
  166.  
  167.     def draw(self, context):
  168.        
  169.         layout = self.layout
  170.        
  171.         row = layout.row()
  172.         row.label(text= "base : " +  str(prev_base) )
  173.          
  174.         row = layout.row()
  175.         row.label(text= "neck : " +  str(prev_neck) )
  176.  
  177.         row = layout.row()
  178.         row.label(text= "twist : " +  str(prev_twist) )
  179.  
  180.         row = layout.row()
  181.         row.label(text= "mouth : " +  str(prev_mouth) )
  182.  
  183.  
  184.         row = layout.row()
  185.         row.label(text= "l.brow : " +  str(prev_l_brow) )
  186.  
  187.  
  188.         row = layout.row()
  189.         row.label(text= "r.brow : " +  str(prev_r_brow) )
  190.  
  191.  
  192.         self.layout.operator("com_manager.open", icon='PLAY')
  193.         self.layout.operator("com_manager.close", icon='PANEL_CLOSE')
  194.  
  195.  
  196.  
  197.  
  198. # com port management methods for general use by
  199. # the panel
  200.  
  201. class OpenComPort(bpy.types.Operator):
  202.    
  203.     bl_idname = "com_manager.open"
  204.     bl_label = "Open Com Port"
  205.  
  206.     def execute(self, context):
  207.         print("open com port")
  208.         serialport = serial.Serial('COM3', 57600)
  209.         return {'FINISHED'}
  210.    
  211. class CloseComPort(bpy.types.Operator):
  212.    
  213.     bl_idname = "com_manager.close"
  214.     bl_label = "Close Com Port"
  215.  
  216.     def execute(self, context):
  217.         print("close")
  218.         serialport.close() ;          
  219.         return {'FINISHED'}
  220.  
  221.  
  222. def register():
  223.     bpy.utils.register_class(OpenComPort)
  224.     bpy.utils.register_class(CloseComPort)    
  225.     bpy.utils.register_class(ToolsPanel)        
  226.  
  227.  
  228. def unregister():
  229.     bpy.utils.unregister_class(OpenComPort)
  230.     bpy.utils.unregister_class(CloseComPort)
  231.     bpy.utils.unregister_class(ToolsPanel)    
  232.  
  233. if __name__ == "__main__":
  234.     register()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement