gr4ph0s

Modified version of https://github.com/gr4ph0s/C4D-PivotMast

Aug 14th, 2018
429
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.22 KB | None | 0 0
  1. # Modified version of https://github.com/gr4ph0s/C4D-PivotMaster
  2. import c4d
  3. import os
  4. PLUGIN_ID = 1038428
  5. VERSION = 1.3
  6.  
  7.  
  8. class Modeling(object):
  9.  
  10.     @staticmethod
  11.     def GetWorldRotation(doc):
  12.         mat = c4d.modules.snap.GetWorkplaneMatrix(doc, None)
  13.         rot = c4d.utils.MatrixToHPB(mat)
  14.         return rot
  15.  
  16.     @staticmethod
  17.     def mix_vector(vector_list):
  18.         if not len(vector_list):
  19.             return None
  20.  
  21.         final_vector = c4d.Vector()
  22.         for vec in vector_list:
  23.             final_vector += vec
  24.  
  25.         final_vector = c4d.Vector(final_vector.x / len(vector_list),
  26.                                   final_vector.y / len(vector_list),
  27.                                   final_vector.z / len(vector_list))
  28.  
  29.         return final_vector
  30.  
  31.     @staticmethod
  32.     def GlobalToLocal(obj, global_pos):
  33.         obj_mg = obj.GetMg()
  34.         return ~obj_mg * global_pos
  35.  
  36.     @staticmethod
  37.     def LocalToGlobal(obj, local_pos):
  38.         obj_mg = obj.GetMg()
  39.         return obj_mg * local_pos
  40.  
  41.     @staticmethod
  42.     def GetPointsGlobal(obj):
  43.         all_points_pos = obj.GetAllPoints()
  44.         for i in xrange(len(all_points_pos)):
  45.             all_points_pos[i] = Modeling.LocalToGlobal(obj, all_points_pos[i])
  46.         return all_points_pos
  47.  
  48.     @staticmethod
  49.     def SetPointsGlobal(obj, global_point):
  50.         points = obj.GetAllPoints()
  51.        
  52.         for i in range(len(points)):    
  53.           points[i] = Modeling.GlobalToLocal(obj, global_point[i])
  54.  
  55.         obj.SetAllPoints(points)
  56.         obj.Message(c4d.MSG_UPDATE)
  57.  
  58.     @staticmethod
  59.     def GetTangentGlobal(obj):
  60.         pts_local = obj.GetAllPoints()
  61.         global_tangent = list()
  62.  
  63.         for pt_id, pt_local_pos in enumerate(pts_local):
  64.             local_tangent = obj.GetTangent(pt_id)
  65.             local_tangent["vl"] = Modeling.LocalToGlobal(obj, local_tangent["vl"] + pt_local_pos)
  66.             local_tangent["vr"] = Modeling.LocalToGlobal(obj, local_tangent["vr"] + pt_local_pos)
  67.             global_tangent.append(local_tangent)
  68.         return global_tangent
  69.  
  70.     @staticmethod
  71.     def SetTangentGlobal(obj, global_tangent_list):
  72.         pt_count = obj.GetPointCount()
  73.         pts = obj.GetAllPoints()
  74.         local_tangent_list = list()
  75.  
  76.         # Global to Local tangent
  77.         for i in xrange(pt_count):
  78.             vl_local = Modeling.GlobalToLocal(obj, global_tangent_list[i]["vl"]) - pts[i]
  79.             vr_local = Modeling.GlobalToLocal(obj, global_tangent_list[i]["vr"]) - pts[i]
  80.             local_tangent_list.append([vl_local, vr_local])
  81.  
  82.         # Set Tangent
  83.         for tangent_id, tangent in enumerate(local_tangent_list):
  84.             obj.SetTangent(tangent_id, tangent[0], tangent[1])
  85.        
  86.     @staticmethod
  87.     def SetGlobalRotation(obj, rot):
  88.         all_children = obj.GetChildren()
  89.         buffer_data = []
  90.         for child in all_children:
  91.             buffer_child = child.GetMg()
  92.             buffer_data.append(buffer_child)
  93.  
  94.         old_pos = Modeling.GetPointsGlobal(obj)
  95.         old_tangent = None
  96.         if isinstance(obj, c4d.SplineObject):
  97.             if obj.GetInterpolationType() == c4d.SPLINETYPE_BEZIER:
  98.                 old_tangent = Modeling.GetTangentGlobal(obj)
  99.  
  100.         m = obj.GetMg()
  101.         scale = c4d.Vector( m.v1.GetLength(),
  102.                             m.v2.GetLength(),
  103.                             m.v3.GetLength())
  104.  
  105.         m = c4d.utils.HPBToMatrix(rot)
  106.  
  107.         m.off = c4d.Vector()
  108.         m.v1 = m.v1.GetNormalized() * scale.x
  109.         m.v2 = m.v2.GetNormalized() * scale.y
  110.         m.v3 = m.v3.GetNormalized() * scale.z
  111.  
  112.         obj.SetMg(m)
  113.        
  114.         Modeling.SetPointsGlobal(obj, old_pos)
  115.         if old_tangent:
  116.             Modeling.SetTangentGlobal(obj, old_tangent)
  117.  
  118.         for child_index in xrange(len(all_children)):
  119.             child = all_children[child_index]
  120.             buffer_child = buffer_data[child_index]
  121.             child.SetMg(buffer_child)
  122.  
  123.     @staticmethod
  124.     def resetSize(list_obj, doc):
  125.         settings = c4d.BaseContainer()
  126.         settings[c4d.MDATA_RESETSYSTEM_COMPENSATE] = True
  127.         settings[c4d.MDATA_RESETSYSTEM_RECURSIVE] = True
  128.  
  129.         c4d.utils.SendModelingCommand(command=c4d.MCOMMAND_RESETSYSTEM,
  130.                                       list=list_obj,
  131.                                       mode=c4d.MODELINGCOMMANDMODE_ALL,
  132.                                       bc=settings,
  133.                                       doc=doc)
  134.  
  135.  
  136. class UILauncher_Main(c4d.plugins.CommandData):
  137.     dialog = None
  138.     accepted = [c4d.Onull,
  139.                 c4d.Obezier,
  140.                 c4d.Osweep,
  141.                 c4d.Oloft,
  142.                 c4d.Olathe,
  143.                 c4d.Oextrude,
  144.                 c4d.Osds,
  145.                 c4d.Oboole,
  146.                 c4d.Oinstance,
  147.                 c4d.Osymmetry,
  148.                 c4d.Ometaball,
  149.                 c4d.Oconnector]
  150.  
  151.     def Execute(self, doc):
  152.         self.action()
  153.         return True
  154.  
  155.     def action(self):
  156.         doc = c4d.documents.GetActiveDocument()
  157.         objs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
  158.  
  159.         doc.StartUndo()
  160.  
  161.         #Reset Size
  162.         for obj in objs:
  163.             doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  164.         Modeling.resetSize(objs, doc)
  165.  
  166.         #We firstly reset pos of each points objects
  167.         for obj in reversed(objs):
  168.             if isinstance(obj, c4d.PointObject) and not self.is_first_child_of_sweep(obj):
  169.                 doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  170.                 rotation = Modeling.GetWorldRotation(doc)
  171.                 Modeling.SetGlobalRotation(obj, rotation)
  172.                 obj.Message(c4d.MSG_UPDATE)
  173.                 c4d.EventAdd()
  174.  
  175.         for obj in reversed(objs):
  176.             if obj.GetType() in self.accepted:
  177.                 # get children matrice
  178.                 obj_under = obj.GetChildren()
  179.                 all_obj_under = self.get_all_children(obj, obj.GetNext(), True)
  180.                 old_matrice = self.get_list_of_matrice(obj_under)
  181.  
  182.                 #change_null obj                  
  183.                 m = obj.GetMg()
  184.                 m.off = c4d.Vector()
  185.  
  186.                 doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj)
  187.                 obj.SetMg(m)
  188.                 obj.SetAbsRot(c4d.Vector())
  189.                 obj.SetAbsScale(c4d.Vector(1))
  190.                 obj.Message(c4d.MSG_UPDATE)
  191.  
  192.                 # set children matrice
  193.                 self.set_list_of_matrice(obj_under, old_matrice, doc)
  194.  
  195.         c4d.EventAdd()
  196.         doc.EndUndo()
  197.  
  198.     def is_first_child_of_sweep(self, obj):
  199.         if not obj.GetUp():
  200.             return False
  201.  
  202.         obj_up = obj.GetUp()
  203.         if obj_up.GetDown() != obj:
  204.             return False
  205.  
  206.         if obj_up.GetDown().GetDown():
  207.             return False
  208.  
  209.         if obj_up.CheckType(c4d.Osweep):
  210.             return True
  211.         elif obj_up.CheckType(c4d.Olathe):
  212.             return True
  213.         else:
  214.             return False
  215.  
  216.     def set_list_of_matrice(self, obj_under, new_matrice, doc):
  217.         for i in xrange(len(obj_under)):
  218.             doc.AddUndo(c4d.UNDOTYPE_CHANGE, obj_under[i])
  219.             obj_under[i].SetMg(new_matrice[i])
  220.             obj_under[i].Message(c4d.MSG_UPDATE)
  221.  
  222.     def get_list_of_matrice(self, obj_list):
  223.         buffer_pos = list()
  224.         for obj in obj_list:
  225.             buffer_pos.append(obj.GetMg())
  226.  
  227.         return buffer_pos
  228.  
  229.     def get_all_children(self, obj, next_obj, first=False):
  230.         buffer_children = list()
  231.         while obj and obj != next_obj:
  232.             if not first:
  233.                 buffer_children.append(obj)
  234.             buffer_children += self.get_all_children(obj.GetDown(), next_obj)
  235.             obj = obj.GetNext()
  236.  
  237.         return buffer_children
  238.  
  239. if __name__ == "__main__":
  240.     dir, file = os.path.split(__file__)
  241.     bmp = c4d.bitmaps.BaseBitmap()
  242.     bmp.InitWith(os.path.join(dir, "center_axis.png"))
  243.     c4d.plugins.RegisterCommandPlugin(id=PLUGIN_ID,
  244.                                     str="06 - Bottom axis center - v" + str(VERSION),
  245.                                     help="06 - Bottom axis center - v" + str(VERSION),
  246.                                     info=0,
  247.                                     dat=UILauncher_Main(),
  248.                                     icon=bmp)
Add Comment
Please, Sign In to add comment