Advertisement
Guest User

PivotMaster

a guest
Jul 4th, 2015
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 14.28 KB | None | 0 0
  1. import  c4d,os
  2. from c4d import gui, plugins, Vector, Matrix
  3.  
  4.  
  5. class mesh():
  6.     def __init__(self,doc):
  7.         self._MESH                = doc.GetActiveObject()
  8.    
  9.    
  10.         self._RADIUS              = self._MESH.GetRad()
  11.         self._ALL_POINTS          = self._MESH.GetAllPoints()
  12.         self._NOMBRE_POINT        = self._MESH.GetPointCount()
  13.         self._CURRENT_AXIS        = self._MESH.GetMg()
  14.         self._BOUDING_BOX_CENTER  = self._MESH.GetMp() + self._MESH.GetAbsPos()
  15.  
  16.     def getCenterObj(self):
  17.         self._BOUDING_BOX_CENTER = self._MESH.GetMp() + self._MESH.GetAbsPos()  
  18.    
  19.     def getCurrentAxis(self):
  20.         self._CURRENT_AXIS = self._MESH.GetMg()
  21.        
  22.     def newMatrix(self):
  23.         return Matrix(self._BOUDING_BOX_CENTER, Vector(1, 0, 0), Vector(0, 1, 0), Vector(0, 0, 1))
  24.    
  25.  
  26. class pivotTool(mesh):
  27.  
  28.     def __init__(self,doc):
  29.         mesh.__init__(self,doc)
  30.  
  31.         self._Matrix = self.newMatrix()
  32.        
  33.        
  34.         self.__FRONT_TOP_LEFT       = 1
  35.         self.__FRONT_TOP_CENTER     = 2
  36.         self.__FRONT_TOP_RIGHT      = 3
  37.         self.__FRONT_CENTER_LEFT    = 4
  38.         self.__FRONT_CENTER_CENTER  = 5
  39.         self.__FRONT_CENTER_RIGHT   = 6
  40.         self.__FRONT_BOT_LEFT       = 7
  41.         self.__FRONT_BOT_CENTER     = 8
  42.         self.__FRONT_BOT_RIGHT      = 9
  43.  
  44.  
  45.         self.__MID_TOP_LEFT         = 10
  46.         self.__MID_TOP_CENTER       = 11
  47.         self.__MID_TOP_RIGHT        = 12
  48.         self.__MID_CENTER_LEFT      = 13
  49.         self.__MID_CENTER_CENTER    = 14
  50.         self.__MID_CENTER_RIGHT     = 15
  51.         self.__MID_BOT_LEFT         = 16
  52.         self.__MID_BOT_CENTER       = 17
  53.         self.__MID_BOT_RIGHT        = 18
  54.  
  55.  
  56.         self.__BACK_TOP_LEFT        = 19
  57.         self.__BACK_TOP_CENTER      = 20
  58.         self.__BACK_TOP_RIGHT       = 21
  59.         self.__BACK_CENTER_LEFT     = 22
  60.         self.__BACK_CENTER_CENTER   = 23
  61.         self.__BACK_CENTER_RIGHT    = 24
  62.         self.__BACK_BOT_LEFT        = 25
  63.         self.__BACK_BOT_CENTER      = 26
  64.         self.__BACK_BOT_RIGHT       = 27
  65.        
  66.    
  67.     def updateAxis(self, where):
  68.         vbuffer   = Vector(0, 0, 0)
  69.         nbpts     = self._MESH.GetPointCount()
  70.         points    = self._MESH.GetAllPoints()
  71.    
  72.         #FRONT_TOP_LEFT
  73.         if where == self.__FRONT_TOP_LEFT :
  74.             vbuffer = Vector (-self._RADIUS.x, self._RADIUS.y , -self._RADIUS.z)
  75.             self._Matrix.off += vbuffer
  76.        
  77.         #FRONT_TOP_CENTER
  78.         elif where == self.__FRONT_TOP_CENTER :
  79.             vbuffer = Vector ( 0, self._RADIUS.y , -self._RADIUS.z )
  80.             self._Matrix.off += vbuffer
  81.                    
  82.          #FRONT_TOP_RIGHT
  83.         elif where == self.__FRONT_TOP_RIGHT :
  84.             vbuffer = Vector (self._RADIUS.x, self._RADIUS.y , -self._RADIUS.z)
  85.             self._Matrix.off += vbuffer        
  86.                
  87.         #FRONT_CENTER_LEFT
  88.         elif where == self.__FRONT_CENTER_LEFT :
  89.             vbuffer = Vector (-self._RADIUS.x, 0 , -self._RADIUS.z)
  90.             self._Matrix.off += vbuffer
  91.        
  92.         #FRONT_CENTER_CENTER
  93.         elif where == self.__FRONT_CENTER_CENTER :
  94.             vbuffer = Vector ( 0, 0 , -self._RADIUS.z )
  95.             self._Matrix.off += vbuffer
  96.                    
  97.          #FRONT_CENTER_RIGHT
  98.         elif where == self.__FRONT_CENTER_RIGHT :
  99.             vbuffer = Vector (self._RADIUS.x, 0 , -self._RADIUS.z)
  100.             self._Matrix.off += vbuffer      
  101.            
  102.         #FRONT_BOT_LEFT
  103.         elif where == self.__FRONT_BOT_LEFT :
  104.             vbuffer = Vector (-self._RADIUS.x, -self._RADIUS.y , -self._RADIUS.z)
  105.             self._Matrix.off += vbuffer
  106.        
  107.         #FRONT_BOT_CENTER
  108.         elif where == self.__FRONT_BOT_CENTER :
  109.             vbuffer = Vector ( 0, -self._RADIUS.y , -self._RADIUS.z )
  110.             self._Matrix.off += vbuffer
  111.                    
  112.         #FRONT_BOT_RIGHT
  113.         elif where == self.__FRONT_BOT_RIGHT :
  114.             vbuffer = Vector (self._RADIUS.x, -self._RADIUS.y , -self._RADIUS.z)
  115.             self._Matrix.off += vbuffer    
  116.        
  117.         #MID_TOP_LEFT
  118.         elif where == self.__MID_TOP_LEFT :
  119.             vbuffer = Vector (-self._RADIUS.x, self._RADIUS.y , 0)
  120.             self._Matrix.off += vbuffer
  121.        
  122.         #MID_TOP_CENTER
  123.         elif where == self.__MID_TOP_CENTER :
  124.             vbuffer = Vector ( 0, self._RADIUS.y , 0 )
  125.             self._Matrix.off += vbuffer
  126.                    
  127.          #MID_TOP_RIGHT
  128.         elif where == self.__MID_TOP_RIGHT :
  129.             vbuffer = Vector (self._RADIUS.x, self._RADIUS.y , 0)
  130.             self._Matrix.off += vbuffer        
  131.                
  132.         #MID_CENTER_LEFT
  133.         elif where == self.__MID_CENTER_LEFT :
  134.             vbuffer = Vector (-self._RADIUS.x, 0 , 0)
  135.             self._Matrix.off += vbuffer
  136.        
  137.         #MID_CENTER_CENTER
  138.         elif where == self.__MID_CENTER_CENTER :
  139.             vbuffer = Vector ( 0, 0 , 0 )
  140.             self._Matrix.off += vbuffer
  141.                    
  142.          #MID_CENTER_RIGHT
  143.         elif where == self.__MID_CENTER_RIGHT :
  144.             vbuffer = Vector (self._RADIUS.x, 0 , 0)
  145.             self._Matrix.off += vbuffer      
  146.            
  147.         #MID_BOT_LEFT
  148.         elif where == self.__MID_BOT_LEFT :
  149.             vbuffer = Vector (-self._RADIUS.x, -self._RADIUS.y , 0)
  150.             self._Matrix.off += vbuffer
  151.        
  152.         #MID_BOT_CENTER
  153.         elif where == self.__MID_BOT_CENTER :
  154.             vbuffer = Vector ( 0, -self._RADIUS.y , 0 )
  155.             self._Matrix.off += vbuffer
  156.                    
  157.         #MID_BOT_RIGHT
  158.         elif where == self.__MID_BOT_RIGHT :
  159.             vbuffer = Vector (self._RADIUS.x, -self._RADIUS.y , 0)
  160.             self._Matrix.off += vbuffer
  161.        
  162.         #BACK_TOP_LEFT
  163.         elif where == self.__BACK_TOP_LEFT :
  164.             vbuffer = Vector (-self._RADIUS.x, self._RADIUS.y , self._RADIUS.z)
  165.             self._Matrix.off += vbuffer
  166.        
  167.         #BACK_TOP_CENTER
  168.         elif where == self.__BACK_TOP_CENTER :
  169.             vbuffer = Vector ( 0, self._RADIUS.y , self._RADIUS.z )
  170.             self._Matrix.off += vbuffer
  171.                    
  172.          #BACK_TOP_RIGHT
  173.         elif where == self.__BACK_TOP_RIGHT :
  174.             vbuffer = Vector (self._RADIUS.x, self._RADIUS.y , self._RADIUS.z)
  175.             self._Matrix.off += vbuffer        
  176.                
  177.         #BACK_CENTER_LEFT
  178.         elif where == self.__BACK_CENTER_LEFT :
  179.             vbuffer = Vector (-self._RADIUS.x, 0 , self._RADIUS.z)
  180.             self._Matrix.off += vbuffer
  181.        
  182.         #BACK_CENTER_CENTER
  183.         elif where == self.__BACK_CENTER_CENTER :
  184.             vbuffer = Vector ( 0, 0 , self._RADIUS.z )
  185.             self._Matrix.off += vbuffer
  186.                    
  187.          #BACK_CENTER_RIGHT
  188.         elif where == self.__BACK_CENTER_RIGHT :
  189.             vbuffer = Vector (self._RADIUS.x, 0 , self._RADIUS.z)
  190.             self._Matrix.off += vbuffer      
  191.            
  192.         #BACK_BOT_LEFT
  193.         elif where == self.__BACK_BOT_LEFT :
  194.             vbuffer = Vector (-self._RADIUS.x, -self._RADIUS.y , self._RADIUS.z)
  195.             self._Matrix.off += vbuffer
  196.        
  197.         #BACK_BOT_CENTER
  198.         elif where == self.__BACK_BOT_CENTER :
  199.             vbuffer = Vector ( 0, -self._RADIUS.y , self._RADIUS.z )
  200.             self._Matrix.off += vbuffer
  201.                    
  202.         #BACK_BOT_RIGHT
  203.         elif where == self.__BACK_BOT_RIGHT :
  204.             vbuffer = Vector (self._RADIUS.x, -self._RADIUS.y , self._RADIUS.z)
  205.             self._Matrix.off += vbuffer
  206.      
  207.         newMatrix = ~self._Matrix * self._CURRENT_AXIS
  208.         for i in range(nbpts) :
  209.             points[i] = newMatrix.Mul(points[i])            
  210.        
  211.         self._MESH.SetAllPoints(points)
  212.         self._MESH.SetMl(self._Matrix)
  213.  
  214.  
  215.  
  216.  
  217. class MyUA(c4d.gui.GeUserArea):
  218.  
  219.     xValue = 0          
  220.     yValue = 0
  221.  
  222.     def __init__(self,doc):
  223.        
  224.         dir, file = os.path.split(__file__)
  225.         path = os.path.join(dir, "res")      
  226.         image = path + "\image1.jpg"
  227.  
  228.         self.document = doc
  229.         self.__hover = False
  230.  
  231.         self.position = ([  [8   ,32  ,28  ,48  ,1],
  232.                             [61  ,43  ,78  ,58  ,2],
  233.                             [116 ,52  ,132 ,68  ,3],
  234.                             [8   ,94  ,25  ,109 ,4],
  235.                             [61  ,105 ,77  ,129 ,5],
  236.                             [116 ,118 ,130 ,130 ,6],
  237.                             [10  ,157 ,25  ,171 ,7],
  238.                             [62  ,167 ,78  ,180 ,8],
  239.                             [115 ,179 ,132 ,194 ,9],
  240.  
  241.                             [46  ,20  ,61  ,32  ,10],
  242.                             [98  ,27  ,112 ,42  ,11],
  243.                             [153 ,39  ,167 ,53  ,12],
  244.                             [46  ,79  ,62  ,93  ,13],
  245.                             [90  ,80  ,120 ,113 ,14],
  246.                             [152 ,100 ,166 ,115 ,15],
  247.                             [47  ,139 ,62  ,152 ,16],
  248.                             [97  ,150 ,114 ,164 ,17],
  249.                             [150 ,162 ,166 ,178 ,18],
  250.  
  251.                             [80  ,6   ,96  ,17  ,19],
  252.                             [133 ,14  ,148 ,28  ,20],
  253.                             [186 ,23  ,201 ,36  ,21],
  254.                             [82  ,64  ,96  ,77  ,22],
  255.                             [133 ,75  ,146 ,87  ,23],
  256.                             [185 ,84  ,200 ,99  ,24],
  257.                             [83  ,122 ,97  ,134 ,25],
  258.                             [132 ,133 ,147 ,147 ,26],
  259.                             [184 ,142 ,202 ,159 ,27]
  260.                             ])
  261.  
  262.         self.bmp = c4d.bitmaps.BaseBitmap()   #Create an instance of the BaseBitmap class
  263.         self.bmp.InitWith(image)              #Initialize it with the image
  264.  
  265.         self.xValue = 5
  266.         self.yValue = 5
  267.  
  268.     def DrawMsg(self, x1, y1, x2, y2, msg):
  269.  
  270.         self.DrawSetPen(c4d.COLOR_BG)         #COLOR_BG is the image we load with DrawBitmap
  271.         self.DrawRectangle(x1, y1, x2, y2)    #Draws a rectangle and fills it with the image bitmap
  272.         self.SetClippingRegion(x1, y1, x2, y2)
  273.         w, h = self.bmp.GetSize()
  274.         self.DrawBitmap(self.bmp, x1 + self.xValue, y1 + self.yValue, w, h, 0, 0, w, h, c4d.BMP_NORMAL | c4d.BMP_ALLOWALPHA)
  275.  
  276.  
  277.  
  278.         self.DrawBorder(c4d.BORDER_ROUND, x1+5, y1+5, x2-5, y2-5)
  279.  
  280.  
  281.     def Message(self, msg, result):
  282.         if msg.GetId() == c4d.BFM_GETCURSORINFO:
  283.             if not self.__hover:
  284.                 print "over"
  285.                 self.__hover = True
  286.                 self.Redraw()
  287.                 self.SetTimer(100)
  288.         return super(MyUA, self).Message(msg, result)
  289.  
  290.     def Timer(self, msg):
  291.         base = self.Local2Global()
  292.         bc = c4d.BaseContainer()
  293.         res = self.GetInputState(c4d.BFM_INPUT_MOUSE, c4d.BFM_INPUT_MOUSELEFT, bc)
  294.         x = bc.GetLong(c4d.BFM_INPUT_X) - base['x']
  295.         y = bc.GetLong(c4d.BFM_INPUT_Y) - base['y']
  296.         if x > self.GetWidth() or x < 0 or y > self.GetHeight() or y < 0:
  297.             print "out"
  298.             self.__hover = False
  299.             self.SetTimer(0)
  300.             self.Redraw()
  301.  
  302.     def getButton(self,x,y):
  303.         for i in self.position:
  304.             if x > i[0] and x < i[2] and y > i[1] and y < i[3]:
  305.                 print i[4]
  306.                 self.document.StartUndo()
  307.                 self.document.AddUndo(c4d.UNDOTYPE_CHANGE, op)
  308.  
  309.                 blaaa = pivotTool(self.document)
  310.                 blaaa.updateAxis(i[4])
  311.  
  312.                 op.Message(c4d.MSG_UPDATE)
  313.                 doc.EndUndo()
  314.                 c4d.EventAdd()
  315.        
  316.  
  317.     def InputEvent(self, msg):
  318.  
  319.         action = c4d.BaseContainer(c4d.BFM_ACTION)
  320.         action.SetLong(c4d.BFM_ACTION_ID, self.GetId())
  321.  
  322.         while self.GetInputState(c4d.BFM_INPUT_MOUSE, c4d.BFM_INPUT_MOUSELEFT, msg):
  323.             if msg.GetLong(c4d.BFM_INPUT_VALUE)==0: break
  324.  
  325.             if msg[c4d.BFM_INPUT_DEVICE] == c4d.BFM_INPUT_MOUSE:
  326.                 x, y = msg[c4d.BFM_INPUT_X], msg[c4d.BFM_INPUT_Y]
  327.                 g2l  = self.Global2Local()
  328.                 x += g2l['x']
  329.                 y += g2l['y']
  330.  
  331.             if msg[c4d.BFM_INPUT_CHANNEL] == c4d.BFM_INPUT_MOUSELEFT:
  332.                 self.getButton(x,y)
  333.  
  334.                 action.SetLong(c4d.BFM_ACTION_INDRAG, True)
  335.                 self.SendParentMessage(action)
  336.                 self.Redraw()
  337.  
  338.         action.SetLong(c4d.BFM_ACTION_INDRAG, False)
  339.         self.SendParentMessage(action)
  340.  
  341.         return True
  342.  
  343. class MyDialog(c4d.gui.GeDialog):
  344.     def setData(self,document):
  345.         self.doc = document
  346.         self.ua = MyUA(self.doc)
  347.  
  348.  
  349.     def CreateLayout(self):
  350.         self.AddUserArea(2000, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT)
  351.         self.AttachUserArea(self.ua, 2000)
  352.         self.AddButton(1000, c4d.BFH_CENTER, 80, 15, "Click Me")
  353.         self.AddButton(1001, c4d.BFH_CENTER, 80, 15, "Close")
  354.         return True
  355.  
  356.     def InitValues(self):
  357.         doc = None
  358.         ua = None
  359.         return True
  360.  
  361.     def Command(self, id, msg):
  362.         if id==1000:
  363.             self.ua.xValue = 100
  364.             self.ua.yValue = 100
  365.             self.ua.Redraw()
  366.  
  367.         elif id==1001:
  368.             self.Close()
  369.         return True
  370.  
  371.  
  372.  
  373. class LunchUI(c4d.plugins.CommandData):
  374.     PLUGIN_ID   = 10000090 # TEST ID
  375.     op          = None
  376.     dlg         = None
  377.     ua          = None
  378.     document    = None
  379.     ICON        = None
  380.  
  381.     def Init(self, op) :
  382.         print op
  383.         return True
  384.  
  385.     def Execute(self, doc,op):
  386.         if not self.dlg: self.dlg = MyDialog()
  387.         self.dlg.setData(doc)
  388.         self.dlg.Open(c4d.DLG_TYPE_ASYNC, self.PLUGIN_ID, -1, -1, 220, 310)
  389.         return True
  390.  
  391.     def RestoreLayout(self, subid):
  392.         if not self.dlg:
  393.             self.dlg  = MyDialog()
  394.         return self.dlg.Restore(self.PLUGIN_ID, subid)
  395.  
  396.  
  397.     @classmethod
  398.     def Register(AxisMaster):
  399.         data = {
  400.             "id":     AxisMaster.PLUGIN_ID,
  401.             "icon":   AxisMaster.ICON,
  402.             "str":    "Bitmap UA Example",
  403.             "help":   "Some text that shows up at the bottom of the C4D UI",
  404.             "info":   c4d.PLUGINFLAG_COMMAND_HOTKEY,
  405.             "dat":    AxisMaster(),
  406.         }
  407.         c4d.plugins.RegisterCommandPlugin(**data)
  408.  
  409. if __name__ == "__main__":
  410.     LunchUI.Register()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement