C4D逆向细分插件:Python : Subdivision inverse(原版+汉化版) 

2014-11-21 22:42 发布 | 作品版权归原作者所有,仅供参考学习,禁止商业使用!

插件脚本 /[系统辅助]
797 0 0
C4D逆向细分插件:Python : Subdivision inverse(原版+汉化版)
C4D逆向细分插件:Python : Subdivision inverse(原版+汉化版) - C4D之家 - image_01.png

Calcule une approximation de l'objet original subdivisé selon la méthode Catmull-Clark.
经测试,支持WIN/MAC r13-r16
v 1.1 :
- Correction d'un problème de rafraîchissement.

Copier le dossier « vonc_subdinv » dans le dossier « plugins » du répertoire de Cinéma 4D.
Le module utilise un point de départ pour traiter l'objet. Ce point doit être commun entre le modèle original et subdivisé. Par défaut, ce point est celui d'indice 0, mais il est possible de le changer manuellement, ou de sélectionner le ou les points de départ puis de cocher la case « Sélection » dans les paramètres du module. Cliquez sur le bouton « Act. » pour actualiser la sélection. à utiliser si vous obtenez des résultats bizarres.
Fichier vonc_subdinv.PYP :
  1. # Subdivision inverse - César Vonc - code.vonc.fr
  2. # v 1.1

  3. import os
  4. import c4d
  5. import webbrowser
  6. from c4d import plugins, utils, bitmaps, Vector
  7. from c4d.utils import Neighbor, VectorAngle

  8. MODULE_ID = 1029594
  9. VONC_SUBDINV_NOM = 1000
  10. VONC_SUBDINV_TYPE = 1000
  11. VONC_SUBDINV_TYPE_CC1 = 0
  12. VONC_SUBDINV_TYPE_CC2 = 1
  13. VONC_SUBDINV_TYPE_CC3 = 3
  14. VONC_SUBDINV_TYPE_CCA = 2
  15. VONC_SUBDINV_SUBD = 1002
  16. VONC_SUBDINV_DEPA = 1003
  17. VONC_SUBDINV_INFO = 1004
  18. VONC_SUBDINV_SELP = 1005
  19. VONC_SUBDINV_INVN = 1006
  20. VONC_SUBDINV_DON = 1007
  21. VONC_SUBDINV_ACTU = 1008

  22. class SubdivisionInverse() :
  23.         obj = None
  24.         doc = None
  25.         obj_nbpts = 0
  26.         obj_nbpol = 0
  27.         obj_n = None
  28.         pts_traites = []
  29.         pol_traites = []
  30.         nouv_polys = []
  31.         pts_orig = []
  32.         nouv_pts = []
  33.         nouv_pts_inv = []
  34.         nouv_coor = []
  35.         pts_corres = []
  36.         pol_corres = []
  37.         cor_poly_polynet = [] # Correspondance [id nouv_polys] = id nouv_polys nettoyé
  38.         cor_polynet_poly = [] # Correspondance [id nouv_polys nettoyé] = id nouv_polys
  39.         _GetAllPolygons = []
  40.         _GetPointPolys = []
  41.         
  42.         def _NettoieTab(self, tab) :
  43.                 tab_net = []
  44.                 j = 0
  45.                 i = 0
  46.                 for val in tab :
  47.                         if val and len(val) > 2 :
  48.                                 tab_net.append(val)
  49.                                 self.cor_poly_polynet.append(j)
  50.                                 self.cor_polynet_poly.append(i)
  51.                                 j += 1
  52.                         else : self.cor_poly_polynet.append(-1)
  53.                         i += 1
  54.                 return tab_net
  55.         
  56.         def _SommeVecteur(self, obj, vecs) :
  57.                 if not vecs : return Vector()
  58.                 s = Vector()
  59.                 for v in vecs :
  60.                         s += obj.GetPoint(v)
  61.                 return s
  62.         
  63.         def _MoyenneVecteur(self, obj, vecs) :
  64.                 q = len(vecs)
  65.                 if not q : return Vector()
  66.                 m = Vector()
  67.                 for v in vecs :
  68.                         m += obj.GetPoint(v)
  69.                 m /= float(q)
  70.                 return m
  71.         
  72.         def _RempliCoorArete(self, i, pa, ps, nb) :
  73.                 obj = self.obj
  74.                 n = self.obj_n
  75.                
  76.                 for arete in pa :
  77.                         pass
  78.         
  79.         def _RempliCoor(self, i, pa, ps, nb, mode) :
  80.                 obj = self.obj
  81.                 Po = obj.GetPoint(i)
  82.                
  83.                 if mode == 2 :
  84.                         self.nouv_coor[i] = Po
  85.                         return
  86.                
  87.                 if nb < len(pa) : # Bordure
  88.                         n = self.obj_n
  89.                         pa_bor = []
  90.                         pa_nb = 0
  91.                         for arete in pa :
  92.                                 if pa_nb == 2 : break
  93.                                 a, b = n.GetEdgePolys(i, arete)
  94.                                 if a == -1 or b == -1 :
  95.                                         pa_bor.append(arete)
  96.                                         pa_nb += 1
  97.                         
  98.                         Mpa = self._MoyenneVecteur(obj, pa_bor)
  99.                         pos = 2.0 * Po - Mpa
  100.                
  101.                 elif nb == 3 :
  102.                         if mode == 0 :
  103.                                 Mps = self._MoyenneVecteur(obj, ps)
  104.                                 pos = Po + (Po - Mps) * 2.0
  105.                         
  106.                         elif mode == 1 or mode == 3 :
  107.                                 # Calcul des coordonnées PA fictives
  108.                                 Mpa = Vector()
  109.                                 Mps = self._MoyenneVecteur(obj, ps)
  110.                                 for arete in pa :
  111.                                         if not self.nouv_coor[arete] :
  112.                                                 paA, psA, nbA = self._RecupPaPs(arete, False)
  113.                                                 if nbA == 3 : continue
  114.                                                 self._RempliCoor(arete, paA, psA, nbA, mode)
  115.                                         Mpa += self.nouv_coor[arete]
  116.                                 Mpa /= float(len(pa))
  117.                                 
  118.                                 pos = (Mpa-Po) * 2.0 + Po - (Po-Mps) * 0.75 #0.58335
  119.                                 
  120.                                 if mode == 3 :
  121.                                         pos = (pos + Po + (Po - Mps) * 2.0) * 0.5
  122.                                 #return (i, pa, ps, nb)
  123.                
  124.                 else :
  125.                         Spa = self._SommeVecteur(obj, pa)
  126.                         Sps = self._SommeVecteur(obj, ps)
  127.                         pos = (Po*nb)/(nb-3.0) + (-4.0*Spa)/(nb*(nb-3.0)) + Sps/(nb*(nb-3.0))
  128.                
  129.                 self.nouv_coor[i] = pos
  130.                
  131.         
  132.         def _RempliPolys(self, i, pts_surf) :
  133.                 for p in pts_surf :
  134.                         poly = self.nouv_polys[p]
  135.                         if not poly : self.nouv_polys[p] = [i]
  136.                         else : self.nouv_polys[p].append(i)
  137.                         
  138.                         # Correspondance polys subdivisés > nouv polys
  139.                         pointpolys = self._GetPointPolys[p] #self.obj_n.GetPointPolys(p)
  140.                         for pointpoly in pointpolys :
  141.                                 self.pol_corres[pointpoly] = p
  142.                         
  143.         def _RecupPo(self, po, pa) :
  144.                 obj = self.obj
  145.                 n = self.obj_n
  146.                 pts_traites = self.pts_traites
  147.                 pol_traites = self.pol_traites
  148.                 pos = []
  149.                
  150.                 for a in pa :
  151.                         polys = self._GetPointPolys[a] #n.GetPointPolys(a)
  152.                         points = []
  153.                         
  154.                         for pol in polys :
  155.                                 if pol_traites[pol] : continue
  156.                                 p = self._GetAllPolygons[pol] #obj.GetPolygon(pol)
  157.                                 points.extend([p.a, p.b, p.c, p.d])
  158.                                 pol_traites[pol] = True
  159.                         points = list(set(points))
  160.                         
  161.                         for pt in points :
  162.                                 if pts_traites[pt] : continue
  163.                                 arete = n.GetEdgePolys(a, pt)
  164.                                 if arete != (-1, -1) :
  165.                                         pos.append(pt)
  166.                                         break
  167.                
  168.                 return pos
  169.         
  170.         def _RecupPaPs(self, po, traiteur=True) :
  171.                 obj = self.obj
  172.                 n = self.obj_n
  173.                 pts_traites = self.pts_traites
  174.                 pol_traites = self.pol_traites
  175.                
  176.                 polys = self._GetPointPolys[po] #n.GetPointPolys(po)
  177.                 nb = len(polys)
  178.                 points = []
  179.                 ps = []
  180.                 pa = []
  181.                
  182.                 for p in polys :
  183.                         if traiteur : pol_traites[p] = True
  184.                         p = self._GetAllPolygons[p] #obj.GetPolygon(p)
  185.                         points.extend([p.a, p.b, p.c, p.d])
  186.                 points = list(set(points))
  187.                
  188.                 for pt in points :
  189.                         if traiteur :
  190.                                 self.pts_corres[pt].append(po)
  191.                                 pts_traites[pt] = True
  192.                         if pt == po : continue
  193.                         arete = n.GetEdgePolys(po, pt)
  194.                         if arete == (-1, -1) :
  195.                                 ps.append(pt)
  196.                         else :
  197.                                 pa.append(pt)
  198.                
  199.                 return pa, ps, nb
  200.         
  201.         def Execute(self, mode, depart, selp, invn) :
  202.                 if not self.Initialise(depart) : return
  203.                 obj = self.obj
  204.                 doc = self.doc
  205.                 n = self.obj_n
  206.                 pts_traites = self.pts_traites
  207.                 pts_orig = self.pts_orig
  208.                 nouv_pts = self.nouv_pts
  209.                 nouv_pts_inv = self.nouv_pts_inv
  210.                 nouv_polys = self.nouv_polys
  211.                 nouv_coor = self.nouv_coor
  212.                 _RecupPaPs = self._RecupPaPs
  213.                 _RecupPo = self._RecupPo
  214.                 _RempliPolys = self._RempliPolys
  215.                 _RempliCoor = self._RempliCoor
  216.                
  217.                 bs = obj.GetPointS()
  218.                 pts_a_calc = []
  219.                
  220.                 j = 0
  221.                 i_n = 0
  222.                 i_tot = 1
  223.                 for i in pts_orig : # Points de départ pour la recherche des Points Originaux
  224.                         i_n += 1
  225.                         i_p = 0
  226.                         if not pts_traites[i] : # Si le point n'a pas été traité
  227.                                 pts_traites[i] = True
  228.                                 # Récupère les points d'arête, de surface et le nombre de polys autour du point original
  229.                                 pts_arete, pts_surf, nb_poly_cote = _RecupPaPs(i)
  230.                                 
  231.                                 # Calcule les nouvelles coordonnées du PO  # ou renvoie a_calc pour les calculer plus tard
  232.                                 _RempliCoor(i, pts_arete, pts_surf, nb_poly_cote, mode)
  233.                                 # a_calc = _RempliCoor(i, pts_arete, pts_surf, nb_poly_cote, mode)
  234.                                 # if a_calc : pts_a_calc.append(a_calc)
  235.                                 
  236.                                 # Ajoute PO aux futurs nouveaux polys
  237.                                 _RempliPolys(i, pts_surf)
  238.                                 
  239.                                 # Récupère les points originaux aux alentours des points d'arête
  240.                                 pts_orig_tour = _RecupPo(i, pts_arete)
  241.                                 pts_orig.extend(pts_orig_tour)
  242.                                 
  243.                                 nouv_pts_inv[i] = j # Tableau [PO sur l'obj. subdivisé] = PO de l'obj. non subd.
  244.                                 nouv_pts.append(i) # Liste des PO sur l'obj. subdivisé
  245.                                 
  246.                                 i_tot += len(pts_orig_tour)
  247.                                 i_p = 1
  248.                                 j += 1
  249.                         
  250.                         if i_n+i_p >= i_tot : # Si on atteint le bout de pts_orig
  251.                                 if 0 in pts_traites : # S'il reste des points à traiter
  252.                                         nouv_depart = pts_traites.index(0)
  253.                                         pts_orig.append(nouv_depart) # Ajouter le non traité à traiter
  254.                                         i_tot += 1
  255.                
  256.                
  257.                 ### -- Création de l'objet -- ###
  258.                
  259.                 ### -- Récupération des propriétés et sélections -- ###
  260.                 proprietes = obj.GetTags()
  261.                 _Spolsels = []
  262.                 _Npolsels = []
  263.                 _Sptnsels = []
  264.                 _Nptnsels = []
  265.                 _Suvws = []
  266.                 _Nuvws = []
  267.                 for prop in proprietes :
  268.                         if prop.CheckType(c4d.Tpolygonselection) :
  269.                                 _Npolsels.append(prop)
  270.                                 _Spolsels.append(prop.GetClone())
  271.                         elif prop.CheckType(c4d.Tpointselection) :
  272.                                 _Nptnsels.append(prop)
  273.                                 _Sptnsels.append(prop.GetClone())
  274.                         elif prop.CheckType(c4d.Tuvw) :
  275.                                 _Nuvws.append(prop)
  276.                                 _Suvws.append(prop.GetClone())
  277.                 _ASptnsel = obj.GetPointS().GetClone()
  278.                 _ANptnsel = obj.GetPointS()
  279.                 _ASpolsel = obj.GetPolygonS().GetClone()
  280.                 _ANpolsel = obj.GetPolygonS()
  281.                
  282.                 ### -- Création de l'objet -- ###
  283.                
  284.                 nouv_polys_sale = nouv_polys[:]
  285.                 nouv_polys = self._NettoieTab(nouv_polys)
  286.                 nouv_nbpts = len(nouv_pts)
  287.                 nouv_nbpolys = len(nouv_polys)
  288.                
  289.                 # objet  = c4d.BaseObject(c4d.Opolygon)
  290.                 obj.ResizeObject(nouv_nbpts, nouv_nbpolys)
  291.                
  292.                 for pti in xrange(nouv_nbpts) :
  293.                         ans_id = nouv_pts[pti]
  294.                         nouv_id = nouv_pts_inv[ans_id]
  295.                         position = nouv_coor[ans_id]
  296.                         obj.SetPoint(pti, position)
  297.                
  298.                 posi = obj.GetPoint
  299.                 for poli in xrange(nouv_nbpolys) :
  300.                         poly = nouv_polys[poli]
  301.                         pa = nouv_pts_inv[poly[0]]
  302.                         pb = nouv_pts_inv[poly[1]]
  303.                         pd = nouv_pts_inv[poly[2]]
  304.                         if len(poly) != 3 :
  305.                                 pc = nouv_pts_inv[poly[3]]
  306.                                 posa = posi(pa)
  307.                                 posb = posi(pb)
  308.                                 posc = posi(pc)
  309.                                 posd = posi(pd)
  310.                                 vAB = posa - posb
  311.                                 vAC = posa - posc
  312.                                 vAD = posa - posd
  313.                                 vBA = posb - posa
  314.                                 vBC = posb - posc
  315.                                 vCA = posc - posa
  316.                                 vCD = posc - posd
  317.                                 # Dénoue les polys si le point D est à l'ouest
  318.                                 if VectorAngle(vCA, -vAD) < VectorAngle(vCA, -vAB) :
  319.                                         if VectorAngle(vBA, -vAD) < VectorAngle(vBA, -vAC) :
  320.                                                 pc, pd = pd, pc
  321.                                 else :
  322.                                         if VectorAngle(vBC, -vCD) < VectorAngle(vBC, -vCA) :
  323.                                                 pa, pd = pd, pa
  324.                         else : pc = pd
  325.                         
  326.                         cpoly = c4d.CPolygon(pa, pb, pc, pd)
  327.                         obj.SetPolygon(poli, cpoly)
  328.                
  329.                 obj.Message(c4d.MSG_UPDATE)
  330.                 commande = utils.SendModelingCommand(command = c4d.MCOMMAND_ALIGNNORMALS, list = [obj], doc = doc)
  331.                
  332.                 if invn : commande = utils.SendModelingCommand(command = c4d.MCOMMAND_REVERSENORMALS, list = [obj], doc = doc)
  333.                
  334.                 ### -- Modifs des propriétés -- #
  335.                
  336.                 cor_polyS_polyN = [] # Correspondance [polys subdivisés] = nouveaux polys NETTOYé
  337.                 for _p in self.pol_corres : cor_polyS_polyN.append(self.cor_poly_polynet[_p])
  338.                
  339.                 for _i, _Npolsel in enumerate(_Npolsels) : # Sélection de polygones
  340.                         _Spolsel = _Spolsels[_i]
  341.                         _Sbs = _Spolsel.GetBaseSelect()
  342.                         _Nbs = _Npolsel.GetBaseSelect()
  343.                         _Nbs.DeselectAll()
  344.                         for i, sel in enumerate(_Sbs.GetAll(self.obj_nbpol)) :
  345.                                 if not sel : continue
  346.                                 _p = cor_polyS_polyN[i]
  347.                                 if _p != -1 : _Nbs.Select(_p)
  348.                
  349.                 for _i, _Nptnsel in enumerate(_Nptnsels) : # Sélection de points
  350.                         _Sptnsel = _Sptnsels[_i]
  351.                         _Sbs = _Sptnsel.GetBaseSelect()
  352.                         _Nbs = _Nptnsel.GetBaseSelect()
  353.                         _Nbs.DeselectAll()
  354.                         for i, sel in enumerate(_Sbs.GetAll(self.obj_nbpts)) :
  355.                                 if not sel : continue
  356.                                 _p = nouv_pts_inv[i]
  357.                                 if _p != -1 and _p < self.obj_nbpts : _Nbs.Select(_p)
  358.                
  359.                 _ANpolsel.DeselectAll() # Sélection de polygones active
  360.                 for i, sel in enumerate(_ASpolsel.GetAll(self.obj_nbpol)) :
  361.                         if not sel : continue
  362.                         _p = cor_polyS_polyN[i]
  363.                         if _p != -1 : _ANpolsel.Select(_p)
  364.                
  365.                 _ANptnsel.DeselectAll() # Sélection de points active
  366.                 for i, sel in enumerate(_ASptnsel.GetAll(self.obj_nbpts)) :
  367.                         if not sel : continue
  368.                         _p = nouv_pts_inv[i]
  369.                         if _p != -1 and _p < self.obj_nbpts : _ANptnsel.Select(_p)
  370.                
  371.                
  372.                 for _i, _Nuvw in enumerate(_Nuvws) : # UVW
  373.                         _Suvw = _Suvws[_i]
  374.                         for i in xrange(_Nuvw.GetDataCount()):
  375.                                 
  376.                                 k = self.cor_polynet_poly[i]
  377.                                 polys = self._GetPointPolys[k]
  378.                                 # points = nouv_polys[i]
  379.                                 points = []
  380.                                 Npoly = obj.GetPolygon(i)
  381.                                 points.append(nouv_pts[Npoly.a])
  382.                                 points.append(nouv_pts[Npoly.b])
  383.                                 points.append(nouv_pts[Npoly.c])
  384.                                 points.append(nouv_pts[Npoly.d])
  385.                                 
  386.                                 abcd = [Vector(), Vector(), Vector(), Vector()]
  387.                                 for poly in polys :
  388.                                         pol = self._GetAllPolygons[poly]
  389.                                         for j, pt in enumerate(points) :
  390.                                                 if pol.a == pt :
  391.                                                         abcd[j] = _Suvw.GetSlow(poly)["a"]
  392.                                                         break
  393.                                                 elif pol.b == pt :
  394.                                                         abcd[j] = _Suvw.GetSlow(poly)["b"]
  395.                                                         break
  396.                                                 elif pol.c == pt :
  397.                                                         abcd[j] = _Suvw.GetSlow(poly)["c"]
  398.                                                         break
  399.                                                 elif pol.d == pt :
  400.                                                         abcd[j] = _Suvw.GetSlow(poly)["d"]
  401.                                                         break
  402.                                                         
  403.                                 _Nuvw.SetSlow(i, abcd[0], abcd[1], abcd[2], abcd[3])
  404.                
  405.                 # c4d.EventAdd()
  406.         
  407.         def Initialise(self, depart) :
  408.                 if not self.obj : return
  409.                 if not self.doc : return
  410.                 obj = self.obj
  411.                 if not obj.CheckType(c4d.Opolygon) : return
  412.                 self.obj_nbpts = obj.GetPointCount()
  413.                 self.obj_nbpol = obj.GetPolygonCount()
  414.                 if not self.obj_nbpts or not self.obj_nbpol : return
  415.                 self.obj_n = Neighbor()
  416.                 self.obj_n.Init(obj)
  417.                 self.pts_orig = depart
  418.                 self.pts_traites = [False] * self.obj_nbpts
  419.                 self.pol_traites = [False] * self.obj_nbpol
  420.                 self.nouv_polys = [0] * self.obj_nbpts
  421.                 self.nouv_pts = []
  422.                 self.nouv_pts_inv = [-1] * self.obj_nbpts
  423.                 self.nouv_coor = [0] * self.obj_nbpts
  424.                 self.pol_corres = [0] * self.obj_nbpol
  425.                 self.pts_corres = [[] for a in range(self.obj_nbpts)]
  426.                 self.cor_poly_polynet = []
  427.                 self.cor_polynet_poly = []
  428.                 self._GetAllPolygons = obj.GetAllPolygons()
  429.                 self._GetPointPolys = []
  430.                 for i in xrange(self.obj_nbpts) : self._GetPointPolys.append(self.obj_n.GetPointPolys(i))
  431.                 return True
  432.         
  433.         def __init__(self, doc, obj) :
  434.                 self.obj = obj
  435.                 self.doc = doc


  436. class SubdivisionInverseObjet(c4d.plugins.ObjectData):
  437.         subdinv = None
  438.         type = 0
  439.         subd = 1
  440.         depa = 0
  441.         selp = False
  442.         invn = False
  443.         
  444.         def Message(self, node, type, data) :
  445.                 if type == c4d.MSG_MENUPREPARE :
  446.                         node.SetDeformMode(True)
  447.                
  448.                 if type == c4d.MSG_DESCRIPTION_COMMAND :
  449.                         id = data['id'][0].id
  450.                         if id == VONC_SUBDINV_DON : webbrowser.open("http://code.vonc.fr/", 2, True)
  451.                         elif id == VONC_SUBDINV_ACTU : node.SetDirty(c4d.DIRTY_DATA)
  452.                
  453.                 return True
  454.         
  455.         
  456.         def Init(self, op) :
  457.                 donnees = op.GetDataInstance()
  458.                 self.InitAttr(op, int, [VONC_SUBDINV_TYPE])
  459.                 self.InitAttr(op, int, [VONC_SUBDINV_SUBD])
  460.                 self.InitAttr(op, int, [VONC_SUBDINV_DEPA])
  461.                 self.InitAttr(op, bool, [VONC_SUBDINV_SELP])
  462.                 self.InitAttr(op, bool, [VONC_SUBDINV_INVN])
  463.                 op[VONC_SUBDINV_TYPE] = self.type
  464.                 op[VONC_SUBDINV_SUBD] = self.subd
  465.                 op[VONC_SUBDINV_DEPA] = self.depa
  466.                 op[VONC_SUBDINV_SELP] = self.selp
  467.                 op[VONC_SUBDINV_INVN] = self.invn
  468.                 return True
  469.         
  470.         def ModifyObject(self, mod, doc, op, op_mg, mod_mg, lod, flags, thread):
  471.                 if not op.CheckType(c4d.Opolygon) : return True
  472.                 if not op.GetPointCount() : return True
  473.                 if not op.GetPolygonCount() : return True
  474.                
  475.                 self.type = mod[VONC_SUBDINV_TYPE]
  476.                 self.subd = mod[VONC_SUBDINV_SUBD]
  477.                 self.depa = mod[VONC_SUBDINV_DEPA]
  478.                 self.selp = mod[VONC_SUBDINV_SELP]
  479.                 self.invn = mod[VONC_SUBDINV_INVN]
  480.                 self.subdinv = SubdivisionInverse(doc, op)
  481.                
  482.                 for k in xrange(self.subd) :
  483.                         nbp = op.GetPointCount()
  484.                         depart = [self.depa % nbp]
  485.                         if self.selp :
  486.                                 depart = []
  487.                                 bs = op.GetPointS()
  488.                                 for i, sel in enumerate(bs.GetAll(nbp)) :
  489.                                         if not sel : continue
  490.                                         depart.append(i)
  491.                         if not depart : depart = [0]
  492.                         
  493.                         self.subdinv.Execute(self.type, depart, self.selp, self.invn)
  494.                
  495.                 return True
  496.                

  497. if __name__ == "__main__":
  498.          bmp = bitmaps.BaseBitmap()
  499.          dir, f = os.path.split(__file__)
  500.          fn = os.path.join(dir, "res", "vonc_subdinv.tif")
  501.          bmp.InitWith(fn)
  502.          c4d.plugins.RegisterObjectPlugin(id=MODULE_ID, str=c4d.plugins.GeLoadString(VONC_SUBDINV_NOM),
  503.                                                                                 g=SubdivisionInverseObjet,
  504.                                                                                 description="vonc_subdinv",
  505.                                                                                 icon=bmp,
  506.                                                                                 info=c4d.OBJECT_MODIFIER)
复制代码
Fichier c4d_symbols.H :
  1. enum
  2. {
  3.     VONC_SUBDINV_NOM        = 1000,
  4.         
  5.     _DUMMY_ELEMENT_
  6. };
复制代码
Fichier vonc_subdinv.H :
  1. #ifndef _vonc_subdinv_H_
  2. #define _vonc_subdinv_H_

  3. enum
  4. {
  5.         VONC_SUBDINV_TYPE                        = 1000,
  6.         VONC_SUBDINV_TYPE_CC1                = 0,
  7.         VONC_SUBDINV_TYPE_CC2                = 1,
  8.         VONC_SUBDINV_TYPE_CC3                = 3,
  9.         VONC_SUBDINV_TYPE_CCA                = 2,
  10.         VONC_SUBDINV_SUBD                        = 1002,
  11.         VONC_SUBDINV_DEPA                        = 1003,
  12.         VONC_SUBDINV_INFO                        = 1004,
  13.         VONC_SUBDINV_SELP                        = 1005,
  14.         VONC_SUBDINV_INVN                        = 1006,
  15.         VONC_SUBDINV_DON                        = 1007,
  16.         VONC_SUBDINV_ACTU                        = 1008
  17. };

  18. #endif
复制代码

Fichier vonc_subdinv.RES :
  1. CONTAINER vonc_subdinv
  2. {
  3.         NAME vonc_subdinv;
  4.         INCLUDE Obase;

  5.         GROUP ID_OBJECTPROPERTIES
  6.         {
  7.                 LONG VONC_SUBDINV_TYPE
  8.                 {
  9.                         CYCLE
  10.                         {
  11.                                 VONC_SUBDINV_TYPE_CC1;
  12.                                 VONC_SUBDINV_TYPE_CC2;
  13.                                 VONC_SUBDINV_TYPE_CC3;
  14.                                 VONC_SUBDINV_TYPE_CCA;
  15.                         }
  16.                         FIT_H;
  17.                 }
  18.                 LONG VONC_SUBDINV_SUBD { MIN 0; }
  19.                
  20.                 GROUP {
  21.                         COLUMNS 3;
  22.                         LONG VONC_SUBDINV_DEPA { MIN 0; }
  23.                         BOOL VONC_SUBDINV_SELP { }
  24.                         BUTTON VONC_SUBDINV_ACTU { }
  25.                 }
  26.                 BOOL VONC_SUBDINV_INVN { }
  27.                
  28.                 SEPARATOR { LINE; }
  29.                
  30.                 GROUP {
  31.                         STATICTEXT VONC_SUBDINV_INFO { }
  32.                         BUTTON VONC_SUBDINV_DON { }
  33.                 }
  34.         }
  35. }
复制代码
Fichier c4d_strings.STR :
  1. STRINGTABLE
  2. {
  3.         VONC_SUBDINV_NOM "Subdivision inverse";
  4. }
复制代码
Fichier vonc_subdinv.STR :
  1. STRINGTABLE vonc_subdinv
  2. {
  3.         vonc_subdinv "Subdivision inverse";
  4.         
  5.         VONC_SUBDINV_TYPE                        "Type";
  6.         VONC_SUBDINV_TYPE_CC1                "Catmull-Clark (estimation 1)";
  7.         VONC_SUBDINV_TYPE_CC2                "Catmull-Clark (estimation 2)";
  8.         VONC_SUBDINV_TYPE_CC3                "Catmull-Clark (estimation 3)";
  9.         VONC_SUBDINV_TYPE_CCA                "Catmull-Clark (adoucie)";
  10.         VONC_SUBDINV_SUBD                        "Subdivisions";
  11.         VONC_SUBDINV_DEPA                        "Point de d\u00E9part";
  12.         VONC_SUBDINV_INFO                        "v 1.1 - C\u00E9sar Vonc - http://code.vonc.fr";
  13.         VONC_SUBDINV_SELP                        "S\u00E9lection";
  14.         VONC_SUBDINV_INVN                        "Inverser les normales";
  15.         VONC_SUBDINV_DON                        "Faire un don";
  16.         VONC_SUBDINV_ACTU                        "Act.";
  17. }
复制代码

点击下载图标
下载等级
C8D
登录后下载



插件脚本
软件性质:  
适用版本: C4D R15 - C4D R16 - C4D R17 - C4D R18 - C4D R19 - C4D R20 - C4D R21 - C4D S22 - C4D R23 - C4D S24 - C4D R25 - C4D S26 - C4D 2023 - C4D 2024 - C4D 2025
软件版本: Subdivision inverse - v 1.1(R13+R16)
系统平台: Win MAC 
软件语言: 汉化 
插件来源: https://www.c4d.cn/c4dsoft.html
百套精美Kitbash3D模型专题合集下载
时尚卡通办公室人物C4D立体图标工程下载Cinema 4D Fashion Cartoon Office Character 3D Icon Project Download
C4D科技新闻片头电视栏目频道包装动画工程下载Cinema 4D Technology News Headline TV Program Channel Packaging Animation Project Download
关闭

C4D精选推荐 上一条 /10 下一条

智能
客服
快速回复 返回顶部 返回列表